针对于基于surging的dotnetty组件内存泄漏问题

一、概述 

       前段时间客户碰到基于surging内存泄漏问题,邀请我来现场帮忙解决,对于dotnetty 我一直又爱又恨,因堆外内存DirectByteBufferChunk PoolChunk映射分配的16mb始终无法销毁,后面设置优化了dotnetty 环境变量参数,未在同一线程下导致引用计数出现错乱,从而导致的内存泄漏问题。

针对于基于surging的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方法中添加,如下图所示

针对于基于surging的dotnetty组件内存泄漏问题

三、ByteBuf 销毁

surging 在ChannelHandlerAdapter 实例类已经把   ByteBuf进行销毁,如下图所示

针对于基于surging的dotnetty组件内存泄漏问题

 四,ByteBuf分配处理销毁

 如果bytebuff分配处理销毁处在不同线程下,会导致引用计数错乱,导致无法销毁,内存泄漏。在ChannelRead方法中不要开启线程处理,比如Task.Run ,可以在pipeline中添加eventExecutor 进行处理,如下图所示

针对于基于surging的dotnetty组件内存泄漏问题

五,Dump 分析结果

通过运行一天dump文件进行分析,已经未出现Chunk的16mb 内存。

针对于基于surging的dotnetty组件内存泄漏问题

 六、通过链路跟踪Skywalking 来监控是否出现内存性能问题

针对于基于surging的dotnetty组件内存泄漏问题

 

针对于基于surging的dotnetty组件内存泄漏问题

 

针对于基于surging的dotnetty组件内存泄漏问题

 

针对于基于surging的dotnetty组件内存泄漏问题

七、总结

因为身体问题,当中休息了一段时间,预估4月初MQTT会接入到木舟物联网平台,到时候会开放各个协议端口以便让大家进行测试。

发表评论

评论已关闭。

相关文章