相关疑难解决方法(0)

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

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

我们有一台服务器在过去几个月中出现了一些问题,但我们直到前几天才注意到它,因为它开始无法写入目录,因为它包含太多文件。具体来说,它开始在 /var/log/messages 中抛出这个错误:

ext3_dx_add_entry: Directory index full!
Run Code Online (Sandbox Code Playgroud)

有问题的磁盘有大量剩余的 inode:

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3            60719104 3465660 57253444    6% /
Run Code Online (Sandbox Code Playgroud)

所以我猜这意味着我们达到了目录文件本身可以有多少条目的限制。不知道会有多少文件,但正如您所见,不能超过三百万左右。不是那么好,请注意!但这是我的问题之一:上限到底是多少?是可调的吗?在我被骂之前——我想把它调低;这个庞大的目录导致了各种各样的问题。

无论如何,我们在生成所有这些文件的代码中找到了问题,我们已经更正了它。现在我坚持删除目录。

这里有几个选项:

  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; …

ext3 directory kernel rm

118
推荐指数
6
解决办法
5万
查看次数

标签 统计

directory ×1

ext3 ×1

kernel ×1

rm ×1