【发布时间】:2019-10-16 10:35:33
【问题描述】:
即使我正在关闭我正在打开的所有文件和连接,并且当我将软硬限制设置为最大可用(即65535)时,我也会遇到Too Many Open Files 问题。
因此,为了调试,我尝试按时间重新排序lsof 的输出。
【问题讨论】:
-
lsof 命令默认按 PID 升序排序。现在您必须知道订购 PID 或时间是相同的。
即使我正在关闭我正在打开的所有文件和连接,并且当我将软硬限制设置为最大可用(即65535)时,我也会遇到Too Many Open Files 问题。
因此,为了调试,我尝试按时间重新排序lsof 的输出。
【问题讨论】:
如果您可以控制启动命令,请考虑使用 strace/ltrace。它可以显示每个文件的打开/关闭。
# When using ltrace, specify stdlib functions to monitor
ltrace -e open+close YOUR_COMMAND_HERE
OR
# Modern linux system will use openat system call to open a file
strace -e openat,close YOUR_COMMAND_HERE
您还可以将 strace(和 ltrace)附加到正在运行的进程(参见手册页)
如果您知道您有未关闭的(网络)连接(而不是文件),请考虑扩展/替换过滤器以根据需要关注接受(入站连接)、连接(出站连接)。
【讨论】:
如果 strace/ltrace 太过分了,请考虑检查 /proc/PID/fd 文件夹。每个条目修改时间将显示 FD 创建的时间戳,实际上是打开/连接/接受时间:
# X_PID is the PID of the process to monitor/check
ls -lt --time-style=full-iso /proc/$X_PID/fd
样本输出
total 0
lrwx------ 1 owner owner 64 2019-10-16 16:25:14.359506339 +0300 0 -> /dev/pts/0
lrwx------ 1 owner owner 64 2019-10-16 16:25:14.359506339 +0300 1 -> /dev/pts/0
l-wx------ 1 owner owner 64 2019-10-16 16:25:32.183370423 +0300 11 -> /tmp/a
l-wx------ 1 owner owner 64 2019-10-16 16:26:47.862798157 +0300 15 -> /tmp/b
l-wx------ 1 owner owner 64 2019-10-16 16:26:47.862798157 +0300 16 -> /tmp/a
l-wx------ 1 owner owner 64 2019-10-16 16:27:20.918550476 +0300 17 -> /tmp/a
lrwx------ 1 owner owner 64 2019-10-16 16:25:14.359506339 +0300 2 -> /dev/pts/0
lrwx------ 1 owner owner 64 2019-10-16 16:25:14.359506339 +0300 255 -> /dev/pts/0
【讨论】: