如何在不計算的情況下確定目錄中有多少文件?
我在高流量的網路伺服器上遇到了一個相當嚴重的問題。PHP 頁面正在顯著減慢,這似乎只是訪問會話的頁面上的問題,或者正在引用數據庫中的某個表。’/var/log/messages’ 日誌文件,我看到數十萬以下錯誤:‘核心:EXT4-fs 警告(設備 dm-0):ext4_dx_add_entry:目錄索引已滿!’
我懷疑“/var/lib/php/sessions”中存在瓶頸,因為我無法在 Filezilla 中打開該文件夾,也無法使用 grep 計算文件/子目錄的數量。雖然這很可能是硬碟損壞的情況,但我想首先通過檢查此目錄中的文件數量來驗證我的預感。
您將如何在不實際計算該文件夾中的文件的情況下查找文件夾中的文件數量?
目錄的大小(如 所示
ls -ld /var/lib/php/sessions
)可以給出指示。如果它很小,則文件不多。如果它很大,那裡可能有很多條目,或者過去可能有很多。列出內容,只要您不
stat
單獨文件,不應該比讀取相同大小的文件花費更長的時間。可能發生的情況是您有一個別名
ls
dols -F
或ls --color
. 這些選項會導致lstat
對每個文件執行系統呼叫,以查看它們是文件還是目錄。您還需要確保列出點文件並且未對文件列表進行排序。為此,執行:
command ls -f /var/lib/php/sessions | wc -l
如果沒有太多的文件名有換行符,那應該給你一個很好的估計。
$ ls -lhd 1 drwxr-xr-x 2 chazelas chazelas 69M Aug 15 20:02 1/ $ time ls -f 1 | wc -l 3218992 ls -f 1 0.68s user 1.20s system 99% cpu 1.881 total wc -l 0.00s user 0.18s system 9% cpu 1.880 total $ time ls -F 1 | wc -l <still running...>
您還可以通過從
df -i
.例如,如果文件系統安裝在
/var
, 使用 GNUfind
:find /var -xdev -path /var/lib/php/sessions -prune -o \ -printf '%i\n' | sort -u | wc -l
查找不在 /var/lib/php/sessions 中的文件數。如果你將它減去到
IUsed
輸出中的欄位df -i /var
,你會得到一個近似值(因為一些特殊的 inode 沒有連結到典型的 ext 文件系統中的任何目錄)連結到的文件的數量/var/lib/php/sessions
沒有以其他方式連結到其他任何地方(請注意,/var/lib/php/sessions 很可能包含同一文件的十億個條目(實際上,文件上的最大鍊接數將遠低於大多數文件系統上的最大鍊接數),因此該方法是不是萬無一失的)。請注意,如果讀取目錄內容應該相對較快,則刪除文件可能會非常緩慢。
rm -r
,刪除文件時,首先列出目錄內容,然後unlink()
為每個文件呼叫。對於每個文件,系統都必須在那個巨大的目錄中查找文件,如果不進行散列處理,可能會非常昂貴。