如何查找每個程序的打開文件數
我們有 kafka 服務(作為
systemctl
服務)我們在該服務中配置了打開文件的數量
例子:
[Service] LimitMEMLOCK=infinity LimitNOFILE=1500000 Type=forking User=root Group=kafka
現在當服務啟動時,我們想了解 kafka 服務對文件數量的消耗
從Google搜尋,我了解 - https://www.cyberciti.biz/faq/howto-linux-get-list-of-open-files/
我們可以使用命令
fstat
來擷取打開文件的數量作為
fstat -p {PID}
由於我們使用的是生產 RHEL 7.6 安全伺服器,因此不清楚是否
fstat
可以在我們的伺服器上安裝因此我們想了解其他想法?
感謝獲得其他方法
建議的其他方法是-
ls "/proc/$pid/fd"
但這是我機器上的真實例子
ls /proc/176909/fd |more 0 1 10 100 1000 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 1001 10010 10011 10012 . . .
所以我們得到了一長串數字,那麼如何找到打開文件的數量呢?
(see ) 中的
LimitNOFILE
指令對應於systemd
(see )設置的資源限制。可以用或設置在某些 shell 中。man systemd.exec``RLIMIT_NOFILE``setrlimit()``man setrlimit``ulimit -n``limit descriptors
這指定了一個比該程序可以打開的最大文件描述符數大一的值。嘗試(open(2)、pipe(2)、dup(2) 等)超過此限制會產生錯誤 EMFILE。(歷史上,這個限制在 BSD 上被命名為 RLIMIT_OFILE。)
因此,嚴格來說,打開文件描述符的數量限制(更不用說打開文件),如果在設置限制之前(或在創建時繼承),具有該限制的程序可能有更多打開的文件(
clone()
/fork()
)) 並且即使打開的 fd 很少,也無法獲得超過限制的 fd。在 Linux 上,
/proc/<pid>/fd
是一個特殊目錄,其中包含程序打開的每個 fd 的魔法符號連結文件。您可以通過計算它們來獲得它們的數量:
() {print $#} /proc/$pid/fd/*(NoN)
zsh
例如(或ls "/proc/$pid/fd" | wc -l
如羅密歐所示)。您可以通過對它們進行反向數字排序來獲得最高的 pid 值並獲得第一個。
() {print $1} /proc/$pid/fd/*(NnOn:t)
或者使用 GNU
ls
:ls -rv "/proc/$pid/fd" | head -n1
要獲取所有程序的打開 fd 數量的報告,您可以執行以下操作:
(for p (/proc/<->) () {print -r $# $p:t $(<$p/comm) $p/exe(:P)} $p/fd/*(NoN)) | sort -n
更便攜,您可以訴諸
lsof
:lsof -ad0-2147483647 -Ff -p "$pid" | grep -c '^f'
對於打開的文件描述符的數量和:
lsof -ad0-2147483647 -Ff -p "$pid" | sed -n '$s/^f//p'
為最高。