You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:13:17