打开文件的限制

打开文件的限制

我有一个 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

该服务文件指定它必须作为某个特定用户运行,但该用户仍然没有使用限制。

相关内容