在曾经拥有数百万个文件的文件夹上列出目录需要很长时间

在曾经拥有数百万个文件的文件夹上列出目录需要很长时间

文件系统是 ext4,机器已经很多年没有重新启动了,我们现在也不想这样做。

我们曾经有一个包含数百万个小文件(大小为 2-3kb)的文件夹。这几乎破坏了系统,因此我们修复了生成如此多文件的代码,并编写了一个 crontask 来删除目录中的所有文件(因为rm不起作用)

起初一切都很顺利,您输入ls后就会得到 4-5 个剩余文件的完整列表。

然而第二天,当我输入时,ls系统花了很长时间才执行命令(花了几分钟)并且系统负载超过了20这让我很害怕。

几个月来基本上都是这样。当我一天中第一次这样做时,ls系统速度慢得像爬行一样,最终返回...... 5个文件的列表,没有子文件夹。

我相信这是一些 ext4 缓存,我尝试运行各种命令但无济于事。

我还能做些什么来强制 ext4 擦除缓存吗?

系统运行在RAID 1模式下。运行cat /proc/mdstat表明两个驱动器功能齐全且同步。smartctl说驱动器也运行良好。 hdparm 返回以下内容

hdparm -tT /dev/sda1
/dev/sda1:
Timing cached reads:   19238 MB in  2.00 seconds = 9629.50 MB/sec
Timing buffered disk reads: 316 MB in  3.01 seconds = 104.92 MB/sec

答案1

这是 Ext 系列文件系统的一个已知问题;看为什么条目数量多的目录删除条目后大小没有缩小?了解详情。

解决此问题的唯一方法是重新创建目录。首先,重命名现有目录(这将避免进程尝试打开其中的文件时出现问题):

mv brokendir repairdir/

然后,创建一个新目录(尚未使用旧名称):

mkdir newdir

将损坏目录的所有内容移动到新目录:

mv repairdir/* newdir/
mv repairdir/.[!.]* newdir/
mv repairdir/..?* newdir/

(作为三个单独的命令,以便您确切地知道如果其中一个命令失败会发生什么情况,例如如果没有要移动的隐藏文件)。

您可能希望确保新目录的元数据与原始目录相同,特别是其所有权和权限;如果您使用的是 GNU coreutils,则可以通过以下方式完成(一旦repairdir为空)

cp -aT repairdir newdir

最后,将所有内容移回原位,并删除旧目录:

mv newdir brokendir/
rmdir repairdir

相关内容