如何確定哪些程序打開的 inode 最多
這是我的問題,在 munin 圖表中可見:
我使用/打開的索引節點“突然”不斷增加。
有沒有辦法確定哪個程序保留了最近打開的 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>/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 的數量之間的關係
一年之後…
猜猜看,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>/dev/null | wc -l; done | sort -n -k 2
輸出的最後幾行將顯示 /proc/[PID]/fd 目錄,其中包含每個程序的打開文件描述符計數。罪魁禍首程序應該在底部附近。
請注意,/proc/[PID]/fd 中的每個條目在技術上都是一個文件描述符,而不是單獨的打開 inode,每個單獨的打開 inode 必須在 /proc/[PID]/fd 目錄中的某個位置至少有一個單獨的文件描述符。