性能类 为什么执行ls命令时,会卡顿或无响应? 默认情况下,ls会遍历目录下的所有文件,获取文件的元数据信息并展现给用户,如果目录过大如包含10万个文件,可能需要发出10万个读指令,需要耗费很长的时间。 解决方案: 避免单个目录包含过多的文件,建议单目录下文件数量不超过1万个。 执行ls时采用全路径/usr/bin/ls,不添加colorauto参数,可避免遍历目录下文件,大幅减少读指令数量。 为什么在目录下并发创建文件,每秒创建的文件数量达不到IOPS标称的值? 创建文件涉及到“为新文件分配磁盘空间”和“将新文件加入目录”至少2个IO指令: “为新文件分配磁盘空间”可以并发执行,并发程度受文件系统大小影响,文件系统越大,并发程度越高。 “将新文件加入目录”如果修改的是同一目录,不能并发执行。修改速度受IO时延影响较大,如文件系统时延为1ms,无并发的情况下1秒内能完成1000次IO,单目录的创建性能就不会超过1000文件/秒。 解决方案: 避免单个目录包含过多的文件,建议单目录下文件数量不超过1万个。 扩容文件系统,可以提升文件系统的读写性能。 如何解决向多台云主机中挂载的NFS文件系统中写入数据延迟问题? 问题描述: 云主机1更新了文件A,但是云主机2立即去读取时,仍然获取到的是旧的内容。 问题原因: 这涉及两个原因: 第一个原因是,云主机1在写入文件A后,并不会立即进行刷新(flush),而是先进行PageCache操作,依赖于应用层调用fsync或者close来进行刷新。 第二个原因是,云主机2存在文件缓存,可能不会立即从服务器获取最新的内容。例如,在云主机1更新文件A时,云主机2已经缓存了数据,当云主机2再次读取时,仍然使用了缓存中的旧内容。 解决方案: 方案一:在云主机1更新文件后,一定要执行close或者调用fsync。在云主机2读取文件之前,重新打开文件,然后再进行读取。 方案二:关闭云主机1和云主机2的所有缓存。这会导致性能较差,所以请根据实际业务情况选择适合的方案。 关闭云主机1的缓存:在挂载时,添加noac参数,确保所有写入立即落盘。挂载命令示例如下: mount t nfs o vers3,prototcp,async,nolock,noatime,noresvport,nodiratime,wsize1048576,rsize1048576,timeo600,noac 挂载地址 本地挂载路径1 关闭云主机2的缓存:在挂载时,添加actimeo0参数,忽略所有缓存。挂载命令示例如下: mount t nfs o vers3,prototcp,async,nolock,noatime,noresvport,nodiratime,wsize1048576,rsize1048576,timeo600,actimeo0 挂载地址 本地挂载路径2 根据实际情况合理以上方案可要确保云主机1更新文件后,云主机2能立即获取到最新内容。