確定索引節點所使用的位置

確定索引節點所使用的位置

我最近在開發 Web 伺服器上安裝了 Munin,以追蹤系統使用情況。我注意到系統的 inode 使用率每天大約上升 7-8%,儘管磁碟使用率幾乎沒有增加。我猜有什麼東西正在寫大量的小文件,但我找不到什麼/在哪裡。

我知道如何找到磁碟空間使用情況,但我似乎找不到總結 inode 使用情況的方法。

有沒有一種好方法可以按目錄確定 inode 使用情況,以便我可以找到使用來源?

答案1

別指望這會跑得那麼快...

cd 到您懷疑可能存在包含大量 inode 的子目錄的目錄。如果此腳本花費了大量時間,您可能已經找到了檔案系統中要查找的位置。 /var 是個好的開始...

否則,如果您更改到該檔案系統中的頂級目錄並運行它並等待它完成,您將找到包含所有索引節點的目錄。

find . -type d | 
while 
  read line  
do 
  echo "$( find "$line" -maxdepth 1 | wc -l) $line"  
done | 
sort -rn | less

我不擔心分類的成本。我運行了一個測試,對 350,000 個目錄的未排序輸出進行排序花了 8 秒。最初的發現花了 .真正的成本是在 while 循環中打開所有這些目錄。 (循環本身需要 22 秒)。 (測試資料在具有 350,000 個目錄的子目錄上運行,其中一個目錄有 100 萬個文件,其餘目錄有 1 到 15 個)。

許多人指出 ls 不擅長這方面,因為它對輸出進行排序。我嘗試過 echo,但這也不是很好。其他人指出 stat 提供了此資訊(目錄條目的數量),但它不可移植。事實證明 find -maxdepth 在打開目錄和計算 .files 方面確實非常快,所以......這就是......給大家點分!

答案2

如果問題是目錄包含太多文件,這裡有一個簡單的解決方案:

# Let's find which partition is out of inodes:
$ df -hi
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3               2.4M    2.4M       0  100% /
...

# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d

該行背後的想法find是目錄的大小與直接位於該目錄內的檔案數量成正比。因此,我們在這裡尋找其中包含大量文件的目錄。

如果您不想猜測數字,並且更喜歡按“大小”排序列出所有可疑目錄,那也很簡單:

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

答案3

Grrr,評論需要 50 次代表。所以這個答案其實是對克里斯答案的評論。

由於提問者可能並不關心所有目錄,只關心最差的目錄,因此使用排序可能會非常昂貴。

find . -type d | 
while 
  read line  
do 
  echo "$(ls "$line" | wc -l) $line"  
done | 
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]'  | less

這並不像您的版本那麼完整,但它的作用是列印比之前的最大值大的行,大大減少列印輸出的雜訊量,並節省排序的費用。

這樣做的缺點是,如果您有 2 個非常大的目錄,並且第一個目錄恰好比第二個目錄多 1 個 inode,那麼您將永遠不會看到第二個目錄。

更完整的解決方案是編寫一個更聰明的 Perl 腳本來追蹤看到的前 10 個值,並在最後列印出來。但這對於快速回答伺服器故障來說太長了。

另外,一些稍微聰明的 Perl 腳本可以讓您跳過 while 循環 - 在大多數平台上, ls 對結果進行排序,這對於大型目錄來說也可能非常昂貴。這裡不需要 ls 排序,因為我們關心的只是數數。

答案4

這不是對您的問題的直接答案,但使用 find 搜尋最近修改的小檔案可能會縮小您的搜尋範圍:

find / -mmin -10 -size -20k

相關內容