文件系统是 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