我试图找出为什么我的长时间运行的应用程序有时会破坏最大的打开文件描述符限制(ulimit -n)。我想定期记录应用程序打开了多少个文件描述符,这样我就可以看到何时会出现尖峰。
我知道lsof包含了一堆被排除在/proc/$PID/fd之外的项目.这些项目与打开的文件描述符限制有关吗?也就是说,我应该记录来自lsof还是来自/proc/$PID/fd的信息?
发布于 2019-02-08 19:06:53
ls -U /proc/PID/fd | wc -l博士会告诉你应该比ulimit -n少的号码。
/proc/PID/fd应该包含进程打开的所有文件描述符,包括但不限于奇怪的文件描述符,如epoll或inotify句柄、用O_PATH打开的“不透明”目录句柄、用signalfd()或memfd_create()打开的句柄、accept()返回的套接字等等。
我不是一个很好的lsof用户,但是lsof也从/proc那里得到了它的信息。除了procfs之外,我认为没有其他方法可以获得进程在Linux上打开的文件描述符列表,或者通过附加到ptrace进程。
无论如何,进程的当前和根目录、also文件(包括它自己的二进制和动态库)和控制终端不被计算在ulimit -n (RLIMIT_NOFILE)设置的限制范围内,而且它们也不会出现在/proc/PID/fd中,除非进程显式地持有打开的句柄。
https://unix.stackexchange.com/questions/499518
复制相似问题