Filesystems
列表目錄永遠佔用一個曾經有數百萬個文件的文件夾
文件系統是 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
這是 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