Tomcat "Failed to register socket with selector from poller" 中的错误

Error in Tomcat "Failed to register socket with selector from poller"

我在 Ubuntu 的 tomcat 上有一个应用程序 运行 所以有时我会遇到以下错误:

SEVERE: Socket accept failed java.net.SocketException: Too many open files

所以为了解决这个问题,我得到了很少的参考,我修改了 //etc/security/limits.conf 中的配置,如下所示,并增加了我的打开文件限制。

tomcat    soft   nofile  10000
tomcat    hard   nofile  30000

现在,在这些修改之后,我在 Tomcat 上启动了我的服务,当我使用 cat /proc/PID/limits 检查打开文件限制时,我得到了以下信息值。

Max open files            4096               4096              files

所以在这里我的值没有反映所以我使用下面的命令设置了我的软和硬限制值。

prlimit --pid xxxx --nofile=10000:30000

现在,运行 PID 的值已成功反映,但几天后我再次遇到以下错误。

SEVERE [http-nio-8085-ClientPoller-0]org.apache.tomcat.util.net.NioEndpoint$PollerEvent.run Failed to register socket with selector from poller** java.lang.NullPointerException 在 sun.nio.ch.EPollArrayWrapper.isEventsHighKilled(EPollArrayWrapper.java:174)

如果我需要在我的配置中添加任何东西,请您帮忙。或者如果有什么可能是可能的解决方案。

提前致谢!!

/etc/security/limits.conf 文件仅供 PAM(参见 man page)和使用 PAM 的服务使用,例如(图形或文本)登录服务。许多服务根本不参考该文件。

自 Debian 10(以及 Ubuntu 等衍生版本)起,Tomcat 由 SystemD 服务文件启动。 /etc/security/limits.conf 中的值将被忽略,但您可以在 tomcat9.service 文件中指定它们(参见 documentation):在 root shell 中执行:

systemctl edit tomcat9.service

并在出现的编辑器中键入:

[Service]
LimitNOFILE=10000

您收到的第二个错误是由 this JVM bug 引起的:使用 prlimit 更改资源限制会导致 NPE。

备注:如果更改文件描述符的限制,应考虑更改连接器的maxConnections属性:

<Connector port="8080" maxConnections="8192" />

并将其设置为小于限制的值(尽管默认值 8192 似乎适合您选择的 LimitNOFILE)。