我有一个 java 应用程序失败了
java.io.IOException: Too many open files
at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.8.0-internal]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:477) ~[na:1.8.0-internal]
at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:287) ~[na:1.8.0-internal]
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:455) ~[tomcat-embed-core-8.5.27.jar!/:8.5.27]
at java.lang.Thread.run(Thread.java:785) [na:1.8.0-internal]
我的打开文件限制是 30K
$ ulimit -a
...
open files (-n) 30480
...
我现在想知道,什么是正确的检查......
lsof | grep 123 | wc -l
(123 是 java 应用程序的 pid)返回数字 45633。
怎么会超过30K呢?
另一方面,lsof -p 123| wc -l
仅返回 771 - 它没有超出限制。
有人可以帮助我了解这里发生了什么吗?我缺少什么?是所有用户进程的限制总和(这就是我所期望的)?
这是 RedHat 7,Lsof 修订版 4.87。
编辑:好的,我相信我知道差异是什么 -lsof -p ...
仅在存在子进程时显示父级的打开文件
感谢 @schily 的评论,我发现每个子进程的限制仅为 4K(而不是 30K)。
答案1
就我而言,解决方案是,因为我将其作为服务运行(我没有提及,因为我不知道它很重要)
LimitNOFILE=8192
到我的服务文件下/etc/systemd
该服务文件指定它必须作为某个特定用户运行,但该用户仍然没有使用限制。