【Netty源码解读和权威指南】第64篇:Netty生产问题排查——OOM/CPU飙高/连接泄漏全解析
上一篇【第63篇】Netty压测与性能基准——Wrk/JMH实战测量吞吐量下一篇【第65篇】Netty优雅降级与熔断——高可用Netty服务的容错设计一、OOM排查# 1. 确认是否堆外OOMjcmdpidVM.native_memory summary# 查看Direct Memory使用# 2. 开启泄漏检测-Dio.netty.leakDetection.levelPARANOID# 3. 常见泄漏场景ctx.writeAndFlush(buf);// ❌ write后buf未release buf.retain();// ❌ retain后忘记release排查技巧// 使用ResourceLeakDetector追踪ResourceLeakDetector.setLevel(PARANOID);// 日志会有LEAK: ByteBuf.release() was not called...// Recent access records:// #1: com.example.MyHandler.channelRead(MyHandler.java:23)二、CPU飙高排查# 1. 找到CPU高的线程top-H-ppid# 2. 转16进制printf%x\ntid# 3. jstack查看该线程jstackpid|grep-A20hex_tid常见原因NioEventLoop死循环epoll空轮询Bug →rebuildSelector()用户代码死循环Handler中的while(true)时间轮任务堆积大量延时任务未执行三、连接泄漏排查# 查看连接数netstat-an|grepport|wc-l# 查看CLOSE_WAIT状态netstat-an|grepCLOSE_WAIT|wc-l// 监控连接数privatestaticfinalAtomicIntegerconnectionsnewAtomicInteger();channelActive:connections.incrementAndGet();channelInactive:connections.decrementAndGet();// 定期打印连接数eventLoop.scheduleAtFixedRate(()-{System.out.println(Connections: connections.get());},10,10,SECONDS);四、应急止损# 1. 限流临时关闭新连接# 2. 重启优雅关闭→启动# 3. 扩大连接池# 暂时禁用泄漏检测-Dio.netty.leakDetection.levelDISABLED上一篇【第63篇】Netty压测与性能基准——Wrk/JMH实战测量吞吐量下一篇【第65篇】Netty优雅降级与熔断——高可用Netty服务的容错设计