今天在服务器上遇到了一个让我感到疑惑的情况。情况如下:
Syslog显示:
内核:EXT3-fs 警告(设备 sdb2):ext3_dx_add_entry:目录索引已满!
发现罪魁祸首是一个包含 910 万个文件的目录。我知道有 900 万个文件,因为我用这个删除了它们:
perl -e 'my $i=0;for(<*>){$i++;((stat)[9]<(unlink))} print "Files deleted: $i\n"'
完成后我立即运行ls
- 大约花费 3 分钟并返回 1 个文件。
几分钟后,同一目录中又出现了一批新文件(共 910 万个),并且 syslog 再次显示:
内核:EXT3-fs 警告(设备 sdb2):ext3_dx_add_entry:目录索引已满!
我再次运行删除操作,同样的情况再次出现。几分钟后,又出现了一批超过 900 万个文件。
刚刚出现的文件已经很旧了(大约 3 个月前)。
有人可以确认这是否是 ext3 的预期行为吗?
- 当目录索引已满时,会引发目录索引已满
- 允许创建新文件,但不能添加到索引中
- 新文件缓存在“某处”
- 一旦释放了一个插槽,新文件就会添加到索引中(因此会显示出来,例如 ls)
我怀疑这是正在发生的事情,但我目前还没有任何证据。
欢迎提出任何反馈!
请注意,问题不在于如何修复它,而在于了解这里发生了什么。
答案1
“...问题不在于如何解决它,而在于了解这里发生了什么......“
我猜你正遭受(严重的?)文件系统损坏,并且...(虚拟地?)创建和删除的文件越多,损坏就越严重。
我这样说是因为:
你写了 ”...几分钟后 [...] 910 万个文件再次出现在同一个目录中......“。假设您所说的“几分钟”是指 15 分钟。这意味着大约创建了 10K 个文件每秒。即使你的服务器/存储可以处理这样的负载,也很难相信当这样的创建过程正在运行时有不是任何此类活动的迹象!因此,至少有双重事实:
- 每秒创建 10K 个文件(在 15 分钟的时间范围内);
- 你没有注意到系统有任何奇怪的负载/行为
让我想想......创建过程是“假的”,因此,您存在文件系统完整性问题;
即使信息“ext3_dx_add_entry:目录索引已满!“我认为在这种情况下应该不是可以在相关文件系统中创建其他文件(顺便说一句:正如@Stefan 所提到的,评论你的OP),你似乎能够有效地创建其他文件。这又是另一个引起注意的事实——恕我直言——作为部分缓解,“警告“(...而不是“错误”)在日志消息(EXT3-fs警告)中....让我认为即使是内核开发人员也预料到这种情况不是那么“严重”(...他们认为这是一个警告......而不是一个错误。所以它不应该是如此......可怕的事情!);
除了上述情况之外,我还发现另一个 SF 帖子确认至少在特定情况下,问题是文件系统完整性问题。
至于你问题的最后一部分(与“缓存”假设相关的部分),即使我根本不是一个内核黑客,我也坚信这是不是内核行为,因为它超出了内核的范围,需要跨模块处理(无法实现仅处理 ext3 模块)。但是,如果最后一句话完全错误,请不要责怪我!这只是我的“感觉” :-)