当日志指出打开的文件过多时,Java 应用程序有时会出现问题。
好的,让我们看看一些限制......
cat /proc/sys/fs/file-max -> 200000
ulimit -n -> 1024
ulimit -u -> 2000000
ulimit -Hn -> 4096
ulimit -Hs -> 1024
让我们看看顶级打开文件句柄的过滤器说了什么......
sudo lsof | awk '{print $1 " " $2; }' | sort -rn | uniq -c | sort -rn | head -15
热门条目显示
4757521 (database driver used by Java application redacted) 1230
112760 (http thread of java application) 1230
54289 (another java thread) 1230
...
我认为 file-max 是系统范围内可以打开的全局最大文件句柄。lsof 排序输出的第一个条目似乎超出了该限制,但它目前仍在运行。我似乎记得其他系统的情况,过载和打开太多文件意味着我甚至无法运行命令,因为没有可用的文件句柄分配给新进程……但在这种情况下,数字似乎没有加起来。在这种情况下,我在诊断资源使用情况时遗漏了什么?是在每个线程/每个进程/每个用户的数字之间来回切换吗?我不是在问如何增加限制,因为这是使用 syslimit/ulimit/system conf 设置的……相反,我想了解为什么根据 lsof 报告的当前使用情况,报告的限制似乎被忽略了,以及如何追踪报告问题的应用程序的实际限制和资源使用情况。