Linux 机器上的 rm -rf 速度慢

Linux 机器上的 rm -rf 速度慢

在包含许多文件的目录上执行时rm -rf /some/folder/*,服务器性能会显着下降。驱动器是高级 SSD。

尝试了不同的删除文件的方法:find --deletersync(描述这里)。没有帮助。

根据我的经验,这是一个 Azure 问题。

我所说的“慢”是指 2 分 30 秒内处理 116000 个文件。本地需要1秒。其他服务器提供商也有1-3秒。

有没有一种方法可以快速删除许多文件而不影响服务器的总体性能?

答案1

有没有一种方法可以快速删除许多文件而不影响服务器的总体性能

你可以作弊。不幸的是,它并没有解决问题,而只是将其推开。另一方面,这可能是一个有用的解决方法。

代替

rm -rf /some/folder/*

使用

items=(/some/folder/*)                      # List of items to delete
prefix=".DELETE_ME.$$"

for item in "${items[@]}"
do
    x="$${item%/*}/.$prefix.${item##*/}"    # New temporary path for item to delete
    mv -f "$item" "$x" || rm -rf "$item"    # Rename or delete
done

for item in "${items[@]}"
do
    x="$${item%/*}/.$prefix.${item##*/}"
    rm -rf "$x"                             # Delete whatever is left
done >/dev/null 2>&1 &                      # Run sequentially in background

您可以将其封装在脚本中(使用 解析参数for item in "$@"),甚至封装为 shell 函数。

我使用了两个循环,而不是可能更明显的“在后台重命名和删除”,这样您就不会因并行的多个删除而破坏服务器性能。它不会阻止那里的影响,但它可以帮助加快删除速度。

答案2

我认为您可能遇到的问题是您正在尝试删除一个目录中的 116000 个文件。删除目录中的 n 个文件需要 n 次方时间。而且它会变得非常慢。甚至ls -lfind陷入困境。请注意,直线/bin/ls仍然相当快,因为​​它不必访问每个文件。

秘诀在于一开始就不要在一个目录中获取那么多文件。相反,创建多个目录级别。

如果做不到这一点,您只需要等待一段时间即可删除。

答案3

您可以使用-exec rm -rf {} \;

find /some/dir/ -type f -exec rm -rf {} \;

该命令将删除目录中的所有文件/some/dir

相关内容