Proc
lsof 與 /proc/$PID/fd 與 ulimit -n
我試圖找出為什麼我的長時間執行的應用程序有時會破壞最大打開文件描述符限制 (
ulimit -n
) 的原因。我想定期記錄應用程序打開了多少文件描述符,以便我可以看到峰值發生的時間。我知道這
lsof
包括一堆被排除在外的項目/proc/$PID/fd
……這些項目與打開文件描述符限制相關嗎?即我應該從lsof
還是從記錄資訊/proc/$PID/fd
?
tl;博士
ls -U /proc/PID/fd | wc -l
會告訴你應該小於的數字ulimit -n
。
/proc/PID/fd
應該包含程序打開的所有文件描述符,包括但不限於奇怪的epoll
或inotify
句柄,“不透明”目錄句柄O_PATH
,用signalfd()
or打開的句柄memfd_create()
,返回的套接字accept()
等。我不是一個很好的
lsof
使用者,但lsof
也從 獲取它的資訊/proc
。procfs
我不認為有另一種方法來獲取一個程序在 Linux 上打開的文件描述符列表,除了ptrace
.無論如何,目前和根目錄、映射文件(包括它自己的二進制和動態庫)和程序的控制終端不計入使用
ulimit -n
( ) 設置的限制,除非程序明確持有,否則RLIMIT_NOFILE
它們也不會出現在/proc/PID/fd
打開他們的把手。