Filesystems

列表目錄永遠佔用一個曾經有數百萬個文件的文件夾

  • November 26, 2021

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

引用自:https://unix.stackexchange.com/questions/679176