针对于基于surging的dotnetty组件内存泄漏问题
一、概述
前段时间客户碰到基于surging内存泄漏问题,邀请我来现场帮忙解决,对于dotnetty 我一直又爱又恨,因堆外内存DirectByteBufferChunk 中PoolChunk映射分配的16mb始终无法销毁,后面设置优化了dotnetty 环境变量参数,未在同一线程下导致引用计数出现错乱,从而导致的内存泄漏问题。
(木舟物联网平台:http://117.72.121.2:3100 用户:fanly 用户1:fanly12 密码:123456
链路跟踪Skywalking V8:http://117.72.121.2:8080/
surging 微服务引擎开源地址:https://github.com/fanliang11/surging(后面surging 会移动到microsurging进行维护)
二 、环境变量配置
我设置以下基于netty 的环境变量,
Environment.SetEnvironmentVariable("io.netty.allocator.maxOrder", "5");//调整 chunkSize 的大小,只能设置0-14范围内的值,默认值11
Environment.SetEnvironmentVariable("io.netty.allocator.numDirectArenas", "0");// 设置Direct Arenas,默认核数*2
Environment.SetEnvironmentVariable("io.netty.allocator.type", "unpooled");// 不使用内存池
Environment.SetEnvironmentVariable("io.netty.allocator.numHeapArenas", "2");// 设置Heap Arenas,默认核数*2
在surging 代码DotNettyModule的RegisterBuilder方法中添加,如下图所示
三、ByteBuf 销毁
surging 在ChannelHandlerAdapter 实例类已经把 ByteBuf进行销毁,如下图所示
四,By
teBuf分配处理销毁