WSO2 APIM 3.1.0与IS 5.10.0文件句柄耗尽问题求助
解决WSO2 APIM 3.1.0 + IS 5.10.0的「Too many open files」文件句柄泄漏问题
我们在使用WSO2 APIM 3.1.0与Identity Server 5.10.0时频繁触发「Too many open files」错误,日志详情如下:
2024-07-21T23:57:18,620 [-] [PassThrough HTTPS-Listener I/O dispatcher Listener] WARN PassThroughHttpMultiSSLListener System may be unstable: HTTPS ListeningIOReactor encountered a checked exception : Too many open files java.io.IOException: Too many open files at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[?:1.8.0_281] at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:424) ~[?:1.8.0_281] at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:252) ~[?:1.8.0_281] at org.apache.http.impl.nio.reactor.DefaultListeningIOReactor.processEvent(DefaultListeningIOReactor.java:170) [httpcore-nio_4.3.3.wso2v4.jar:?] at org.apache.http.impl.nio.reactor.DefaultListeningIOReactor.processEvents(DefaultListeningIOReactor.java:153) [httpcore-nio_4.3.3.wso2v4.jar:?] at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:349) [httpcore-nio_4.3.3.wso2v4.jar:?] at org.apache.synapse.transport.passthru.core.PassThroughListeningIOReactorManager$1.run(PassThroughListeningIOReactorManager.java:536) [synapse-nhttp-transport_2.1.7.wso2v147.jar:?] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_281]
已将文件句柄软限制提升至65535,但问题仍未解决。经统计,应用每小时新增1000-1500个打开的文件,仅关闭2-3个,导致每3天必须重启服务。当前系统参数:
file-max value is 2097152 Soft limit and Hard limit 65535 Soft Proc and Hard Proc 20000 JVM - -Xms4096m -Xmx4096m -XX:MaxPermSize=1024m
排查与修复步骤
1. 定位泄漏的文件类型
执行lsof -p <WSO2_PROCESS_ID>命令,列出进程打开的所有文件,重点排查:
- 网络套接字(
TYPE=STREAM):确认是否存在大量未关闭的HTTP长连接 - 日志/临时文件:检查是否有未正确关闭的文件流
- JDBC关联资源:验证数据库连接池是否存在连接泄漏
2. 调整PassThrough传输层配置
修改<APIM_HOME>/repository/conf/axis2/axis2.xml中的PassThrough监听器参数:
- 启用连接超时,避免空闲连接占用句柄:
<transportReceiver name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpListener"> <parameter name="port" locked="false">8280</parameter> <parameter name="connectiontimeout">120000</parameter> <!-- 2分钟超时 --> <parameter name="requesttimeout">120000</parameter> </transportReceiver> - 优化I/O线程池大小,减少线程过多导致的句柄占用:
<parameter name="max-threads" locked="false">200</parameter> <parameter name="min-threads" locked="false">50</parameter>
3. 修复Identity Server的资源泄漏
- 检查IS 5.10.0的OAuth2令牌清理任务,确保过期令牌被自动清理,避免会话资源堆积
- 调整IS的JDBC连接池配置,在
<IS_HOME>/repository/conf/datasources/master-datasources.xml中添加如下参数:<datasource> <name>WSO2_IDENTITY_DB</name> <definition type="RDBMS"> <configuration> <maxActive>100</maxActive> <maxIdle>50</maxIdle> <removeAbandoned>true</removeAbandoned> <removeAbandonedTimeout>300</removeAbandonedTimeout> <validationQuery>SELECT 1</validationQuery> <testOnBorrow>true</testOnBorrow> </configuration> </definition> </datasource>
4. 优化JVM NIO参数
在WSO2启动脚本中添加以下JVM参数,减少NIO缓冲区导致的句柄占用:
-Dsun.nio.ch.maxUpdateArraySize=1024 -Djdk.nio.maxCachedBufferSize=262144
5. 应用WSO2官方补丁
APIM 3.1.0和IS 5.10.0存在多个已知的文件句柄泄漏补丁,例如:
- APIM 3.1.0的
PATCH-APIM-3.1.0-0032:修复PassThrough传输层连接泄漏 - IS 5.10.0的
PATCH-IS-5.10.0-0045:修复OAuth会话资源泄漏
6. 配置定期资源清理
- 定期清理APIM临时目录:
<APIM_HOME>/tmp,可通过系统定时任务实现 - 在IS管理控制台调整会话超时时间,确保过期会话被自动删除
内容的提问来源于stack exchange,提问作者Suchindra
相关产品推荐
相关产品推荐

