我试图找出为什么我的长时间运行的应用程序有时会破坏最大打开文件描述符限制 ( ulimit -n
) 的原因。我想定期记录应用程序打开了多少文件描述符,以便我可以看到峰值发生的时间。
我知道这lsof
包括一堆被排除在外的项目/proc/$PID/fd
......这些项目与打开文件描述符限制相关吗?即我应该从lsof
还是从记录信息/proc/$PID/fd
?
我试图找出为什么我的长时间运行的应用程序有时会破坏最大打开文件描述符限制 ( 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
打开他们的把手。