WSO2 IS持续出现Too many open files错误,请求排查解决
解决WSO2中"打开的文件过多"报错问题
在wso2carbon.log中持续出现以下错误日志,说明系统打开的文件句柄数超出限制,导致Tomcat无法接收新的Socket连接:
TID: [-1234] [] [2023-05-28 10:31:46,495] ERROR {org.apache.tomcat.util.net.Acceptor} - Socket 接收失败 java.io.IOException: 打开的文件过多 at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:424) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:252) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:546) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:79) at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:129) at java.lang.Thread.run(Thread.java:748) TID: [-1234] [] [2023-05-28 10:32:44,162] ERROR {org.apache.tomcat.util.net.Acceptor} - Socket 接收失败 java.io.IOException: 打开的文件过多 at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:424) at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:252) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:546) at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:79) at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:129) at java.lang.Thread.run(Thread.java:748)
1. 先排查当前文件句柄使用情况
- 查看系统允许的最大文件句柄数:
cat /proc/sys/fs/file-max - 查看运行WSO2的用户的文件句柄限制:
ulimit -n - 查看WSO2进程实际占用的文件句柄数(替换
<pid>为WSO2的进程ID):lsof -p <pid> | wc -l
2. 临时解决(立即生效,重启服务器后失效)
直接提升当前用户的文件句柄上限,然后重启WSO2:
ulimit -n 65535
3. 永久修改文件句柄限制
用户级配置
编辑运行WSO2的用户的~/.bashrc或~/.bash_profile文件,添加:
ulimit -n 65535
执行以下命令让配置立刻生效:
source ~/.bashrc
系统全局配置
- 编辑
/etc/security/limits.conf,添加以下内容(替换<username>为运行WSO2的用户名):<username> soft nofile 65535 <username> hard nofile 65535 - 编辑
/etc/sysctl.conf,添加:fs.file-max = 655350 - 执行命令让系统配置生效:
sysctl -p
完成后重启服务器,确保配置永久生效。
4. 优化WSO2自身配置减少句柄占用
- 调整Tomcat NIO连接参数:打开
<WSO2_HOME>/repository/conf/tomcat/catalina-server.xml,找到NioEndpoint类型的Connector节点,合理设置maxConnections和maxThreads,避免因连接堆积耗尽句柄:<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="9443" maxConnections="10000" maxThreads="200" ...> - 检查日志配置:确保
<WSO2_HOME>/repository/conf/log4j2.properties中配置了合理的日志滚动策略,限制日志文件的数量和大小,避免生成过多日志文件占用句柄。
内容的提问来源于stack exchange,提问作者Nipuna Upeksha
相关产品推荐
相关产品推荐

