Spring Boot升级后reactor-http-nio线程CPU内存占用过高排查求助
排查方案
1. 隔离定位问题触发源
- 单独启动WebSocket服务,不触发任何
@ReactiveFeignClient调用,观察reactor-http-nio线程的CPU/内存变化,确认问题是WebSocket本身导致,还是feign调用触发的联动问题。 - 单独测试feign-reactive组件:编写独立接口仅调用feign客户端方法,不建立WebSocket连接,验证是否会引发
reactor-http-nio线程负载异常,排查组件自身的资源泄漏或线程阻塞问题。
2. 分析线程执行细节
- 用
jstack抓取高负载时的线程栈,重点查看reactor-http-nio线程的调用链:- 检查是否存在同步阻塞调用(如同步IO、锁等待),Reactor异步模型下的阻塞会直接导致线程池耗尽或CPU空转。
- 排查是否有无限循环/重复订阅场景,比如feign调用的响应未正确取消订阅,导致事件持续触发。
- 用async-profiler生成火焰图,定位CPU占用热点代码,明确是Reactor Netty的IO逻辑、feign的编解码流程,还是业务回调导致的负载。
3. 校验Reactor订阅生命周期
- 确认WebSocket连接断开时,是否调用
Disposable.dispose()取消订阅,避免订阅实例残留引发内存堆积。 - 检查feign-reactive调用的订阅管理:是否滥用
block()导致线程阻塞,或未及时取消不再需要的订阅,引发资源泄漏。 - 添加VM参数
-Dreactor.debug=true开启Reactor调试模式,打印订阅创建栈,排查未正确管理的订阅实例。
4. 验证组件兼容性
- 确认PlaytikaOSS/feign-reactive v4.0.0是否明确支持Spring Boot 3.0.x版本,部分组件跨版本升级可能存在Reactor版本适配、上下文传递错误等问题。
- 尝试降级至feign-reactive兼容版本,或升级至最新稳定版,验证问题是否缓解。
5. 深度内存分析
- 用
jmap或jfr抓取堆内存快照,分析对象分布:- 统计Reactor相关对象(
Flux、Mono、Subscription)的数量,排查是否存在大量未回收实例。 - 检查feign-reactive的客户端实例、请求上下文是否堆积,比如每次调用是否新建客户端而非复用连接池。
- 验证
WebSocketSession等会话对象是否被正确回收,避免内存占用持续升高。
- 统计Reactor相关对象(
6. 配置合理性检查
- 检查Reactor Netty线程池配置:线程数是否设置过大,或
PooledByteBufAllocator参数不当导致内存碎片化。 - 校验feign-reactive配置:是否开启连接池复用,超时参数(
connectTimeout、readTimeout)是否合理,避免请求挂起导致线程长时间占用。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

