Linux

如何確定哪些程序打開的 inode 最多

  • November 12, 2018

這是我的問題,在 munin 圖表中可見:

munin inode 圖表

我使用/打開的索引節點“突然”不斷增加。

有沒有辦法確定哪個程序保留了最近打開的 inode?我使用了<https://unix.stackexchange.com/questions/117093/find-where-inodes-are-being-used>的方法,找到並清理了一些包含我可以擺脫的郵件和日誌的文件夾……不過,如果 inode 是 OPEN 的,那麼一定有一些程序讓它們保持在使用中,對嗎?它可能不一定是文件增加最多的文件夾 - 還是我錯了?

所以我想看看誰讓它們保持開放,然後跟踪使用情況,看看增加的來源

更新

基於 Andrew 的腳本,我創建了一個版本,其中還顯示了程序名稱。由於我正在執行一些可能會重新生成的 nginx/apache 程序,因此我想查看程序名稱的結果。

for dir in /proc/*/fd;
do
   echo -n "$dir ";
   pid=`expr "$dir" : '\/proc\/\(.*\)\/.*'`; # extract the pid
   pname=`ps -p $pid -o comm=`; # grab process name
   echo -n "$pname ";
   ls $dir 2&gt;/dev/null | wc -l;
done | sort -n -k 3

樣本輸出:

/proc/4612/fd sshd 49
/proc/46470/fd node 60
/proc/5655/fd nginx 66
/proc/6656/fd nginx 76
/proc/7654/fd nginx 81
/proc/8578/fd dovecot 107
/proc/9657/fd nginx 117
/proc/3495/fd java 146
/proc/4785/fd mysqld 382

因此,下一個測試將隨著時間的推移記錄分佈,以查看發生了什麼變化以及它與 Morgan 提到的 /proc/sys/fs/inode-nr 的數量之間的關係

一年之後…

一段時間過去了,這是一個新的圖表 munin 開放 inode

猜猜看,9 月底是更換故障驅動器的時間點。所以看起來整個混亂是由磁碟錯誤產生的。儘管如此,這些腳本仍然很有用!

/proc/[PID]/fd計算每個目錄中的條目數。這將為您提供每個程序打開的文件描述符的數量。雖然列舉所有程序需要一段時間,但在計數過程中啟動或停止的失去程序應該不是問題,因為您正在尋找一個具有大量打開文件描述符的長期程序。

像這樣的東西:

for dir in /proc/*/fd;
do
   echo -n "$dir "; #need a space to get real columns for the sort
   ls $dir 2&gt;/dev/null | wc -l;
done | sort -n -k 2

輸出的最後幾行將顯示 /proc/[PID]/fd 目錄,其中包含每個程序的打開文件描述符計數。罪魁禍首程序應該在底部附近。

請注意,/proc/[PID]/fd 中的每個條目在技術上都是一個文件描述符,而不是單獨的打開 inode,每個單獨的打開 inode 必須在 /proc/[PID]/fd 目錄中的某個位置至少有一個單獨的文件描述符。

引用自:https://serverfault.com/questions/707490