momo's Blog.

NAS存储单目录文件太多导致卡死

字数统计: 361阅读时长: 1 min
2022/11/01 Share

前言

业务用了NAS写入了大量的文件, 大概半小时10万吧。 然后就没办法写入了, 执行一下 echo 1 > a.txt 都要30s左右。

原因

找nas那边同学看了一下。总结是
原因: 单目录文件太多,并且代码中有 readdir的操作,导致卡死。

read dir时 如果出现创建或者删除文件,会触发重新readdir,如果两者有并发,并且文件数量多,肯定是readdir会很慢。
后台统计你们97%的OP都是readdir,且量比较大.

既然没办法,那就先删吧。

结果使用之前有写过如何高效的删除百万文件. 删不掉。

实际上删除之前会 readdir,但是业务还在写,两者并发以后就又卡了。

解决

  1. mv dir dir-tmp 停止业务,并将业务目录重命名一下,保证无其他业务继续写入该目录。
  2. 执行删除操作。

找到一个开源的工具, https://github.com/parallel-fs-utils/multi-thread-posix。

针对于数千万的文件

NAS 里面有数千万的文件, 使用 rsync,find -delete, 等删除方式也非常慢;

  1. 使用 find -type d 过滤出目录list
  2. perl -e 'for(<*>){((stat)[9]<(unlink))}' 命令在目录下删除

perl 不是很懂, 具体原理也不是很清楚, 总之删除很快.

参考

  1. https://unix.stackexchange.com/questions/37329/efficiently-delete-large-directory-containing-thousands-of-files
CATALOG
  1. 1. 前言
  2. 2. 原因
  3. 3. 解决
    1. 3.1. 针对于数千万的文件
  4. 4. 参考