前言
业务用了NAS写入了大量的文件, 大概半小时10万吧。 然后就没办法写入了, 执行一下 echo 1 > a.txt 都要30s左右。
原因
找nas那边同学看了一下。总结是
原因: 单目录文件太多,并且代码中有 readdir的操作,导致卡死。
read dir时 如果出现创建或者删除文件,会触发重新readdir,如果两者有并发,并且文件数量多,肯定是readdir会很慢。
后台统计你们97%的OP都是readdir,且量比较大.
既然没办法,那就先删吧。
结果使用之前有写过如何高效的删除百万文件. 删不掉。
实际上删除之前会 readdir,但是业务还在写,两者并发以后就又卡了。
解决
mv dir dir-tmp停止业务,并将业务目录重命名一下,保证无其他业务继续写入该目录。- 执行删除操作。
找到一个开源的工具, https://github.com/parallel-fs-utils/multi-thread-posix。
针对于数千万的文件
NAS 里面有数千万的文件, 使用 rsync,find -delete, 等删除方式也非常慢;
- 使用
find -type d过滤出目录list - 用
perl -e 'for(<*>){((stat)[9]<(unlink))}'命令在目录下删除
perl 不是很懂, 具体原理也不是很清楚, 总之删除很快.