![在曾经拥有数百万个文件的文件夹上列出目录需要很长时间](https://linux22.com/image/198916/%E5%9C%A8%E6%9B%BE%E7%BB%8F%E6%8B%A5%E6%9C%89%E6%95%B0%E7%99%BE%E4%B8%87%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8A%E5%88%97%E5%87%BA%E7%9B%AE%E5%BD%95%E9%9C%80%E8%A6%81%E5%BE%88%E9%95%BF%E6%97%B6%E9%97%B4.png)
文件系统是 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