rm在包含数百万个文件的目录上

Modified on: Sat, 29 Jun 2019 16:20:02 +0800

背景:物理服务器,大约两年,7200-RPM SATA驱动器连接到3Ware RAID卡,ext3 FS安装noatime和data =有序,不受疯狂加载,内核2.6.18-92.1.22 .el5,正常运行时间545天。目录不包含任何子目录,只有数百万个小(~100字节)文件,其中包含一些较大(几KB)的文件。

我们有一台服务器在过去的几个月里已经有点杜鹃了,但是前几天我们只注意到它因为包含太多文件而无法写入目录。具体来说,它开始在/ var / log / messages中抛出此错误:

ext3_dx_add_entry: Directory index full!

有问题的磁盘还有大量的inode:

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            60719104 3465660 57253444    6% /

所以我猜这意味着我们达到了目录文件本身可以有多少条目的限制。不知道会有多少文件,但正如你所看到的,它不能超过三百万左右。请注意,这不是那么好!但这是我的问题的一部分:究竟是什么是上限?它是可调的吗?在我被大喊之前 - 我想调整它向下;这个巨大的目录引起了各种各样的问题。

无论如何,我们在生成所有这些文件的代码中跟踪了问题,我们已经纠正了它。现在我不得不删除目录。

这里有几个选择:

  1. rm -rf (dir)

    我先试过这个。在它运行了一天半之后,我放弃并杀死它,没有任何明显的影响。

  2. 目录上的unlink(2):绝对值得考虑,但问题是通过fsck删除目录中的文件比通过unlink删除更快(2) 。也就是说,无论如何,我必须将这些inode标记为未使用。当然,这假设我可以告诉fsck不要删除/ lost + found中的文件的条目;否则,我刚刚解决了我的问题。除了所有其他问题之外,在阅读了这一点之后,事实证明我可能不得不调用一些内部FS函数,因为我找不到的unlink(2)变体都不允许我只是轻率地删除包含条目的目录。呸。
  3. while [ true ]; do ls -Uf | head -n 10000 | xargs rm -f 2>/dev/null; done )

    这实际上是缩短版;我正在运行的真正的一个,只是在我们用完要删除的文件时添加了一些进度报告和一个干净的停止,是:

    export i=0;
    time ( while [ true ]; do
      ls -Uf | head -n 3 | grep -qF '.png' || break;
      ls -Uf | head -n 10000 | xargs rm -f 2>/dev/null;
      export i=$(($i+10000));
      echo "$i...";
    done )

    这似乎工作得很好。在我写这篇文章时,它在过去30分钟左右删除了260,000个文件。

现在,对于问题:

  1. 如上所述,每个目录的条目限制是否可调?
  2. 为什么需要“真正的7m9.561s / user 0m0.001s / sys 0m0.001s”删除单个文件,该文件是ls -U返回的列表中的第一个文件,并且使用#3中的命令删除前10,000个条目大概需要十分钟,但是现在它很快乐地拖着?就此而言,它在大约30分钟内删除了260,000,但现在又花了15分钟删除了60,000分钟。为什么速度剧烈波动?
  3. 有没有更好的方法来做这种事情?不在目录中存储数百万个文件;我知道这很傻,而且我的手表也不会发生这种情况。谷歌搜索问题并查看SF和SO提供了很多find的变体,由于几个不言而喻的原因,这些变化不会比我的方法快得多。但是delete-via-fsck的想法是否有任何支持?或完全不同的东西?我渴望听到开箱即用(或者不知名的盒子里)的想法。

感谢您阅读小说;随便提问,我一定会回答。我还将使用最终文件数以及删除脚本运行多长时间来更新问题。

最终脚本输出!:

2970000... 2980000... 2990000... 3000000... 3010000... real 253m59.331s user 0m6.061s sys 5m4.019s

因此,在四个多小时内删除了三百万个文件。

作者:,BMDan

最佳答案

data=writeback mount选项值得尝试,以防止文件系统的日志记录。这应该只在删除期间完成,但是如果服务器在删除操作期间被关闭或重新启动则存在风险。

根据此页

  

某些应用程序在使用时显示出非常显着的速度提升。例如,当应用程序创建和删除大量小文件时,可以看到速度改进(...)。

该选项在fstab中设置,或者在安装操作期间设置,用data=ordered替换data=writeback。必须重新安装包含要删除的文件的文件系统。

作者:,Ring Ø

相关问答

添加新评论