在 Lustre 上删除包含大量小文件的目录

在 Lustre 上删除包含大量小文件的目录

我有一个目录,其中包含大量非常小的文件,我想删除这些文件,并且简单地删除该目录rm -rf /path/to/the/dir已经需要几天的时间。

这听起来很奇怪,这速度很慢,但该目录不是常规文件系统上的目录。它是集群的 Lustre 文件系统上的一个目录。

rm我在安装了 Lustre 的集群节点 A 上运行该命令,但 Lustre 的后端有 2 个 ZFS 文件系统,一个在节点 B 上,一个在节点 C 上,因此所有网络流量可能是导致rm速度变慢的原因。

有谁知道比我的方法更快的删除目录的方法?

答案1

一些 GNU 命令,例如在 Lustre 上操作大类文件时,tar 和 rm 效率低下。例如,对于数百万个文件,rm -rf * 可能需要几天的时间,并且对其他用户的 Lustre 产生相当大的影响。
原因就在于扩大外卡所需要的时间。

一种更好的方法是生成要删除或压缩的文件列表,并一次处理一个或一小部分。

一个好方法在删除文件之前检查文件如下:

$ lfs find <dir> -t f > rmlist.txt  
$ vi rmlist.txt  
$ sed -e 's:^:/bin/rm :' rmlist.txt > rmlist.sh  
$ sh rmlist.sh    

# the directory structure will remain, but unless there are many directories, we can simply delete it:  
$ rm -rf <dir>  

Lustre IO 的一些有用参考:
1.https://www.nics.tennessee.edu/computing-resources/file-systems/io-lustre-tips
2.https://www.rc.colorado.edu/support/examples-and-tutorials/parallel-io-on-janus-lustre.html

谢谢!

答案2

使用 munlink:

find -P $dir -type f -o -type l -print0 | xargs -0 munlink

...并删除空目录:

find -P $dir -depth -type d -empty -delete

我用更多参数更新了查找结果。参考:https://support.pawsey.org.au/documentation/display/US/Deleting+Large+Numbers+of+Files+on+Lustre+Filesystems

答案3

由于到目前为止我还没有获得足够的声誉,所以我无法评论@Atisom 的解决方案,因此有一个新的答案:

Atisom 解决方案中显示的命令find不起作用,因为find将匹配-type f-type l -print0

要使其正常工作,请添加括号:

find -P $dir \( -type f -o -type l \) -print0 | xargs -0 munlink

相关内容