找回密码
 立即注册
首页 业界区 业界 针对于基于surging的dotnetty组件内存泄漏问题 ...

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

赏听然 2025-6-2 00:30:44
一、概述 

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

 
    (木舟物联网平台: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 的环境变量,
  1. Environment.SetEnvironmentVariable("io.netty.allocator.maxOrder", "5");//调整 chunkSize 的大小,只能设置0-14范围内的值,默认值11
  2. Environment.SetEnvironmentVariable("io.netty.allocator.numDirectArenas", "0");// 设置Direct Arenas,默认核数*2
  3. Environment.SetEnvironmentVariable("io.netty.allocator.type", "unpooled");// 不使用内存池
  4. Environment.SetEnvironmentVariable("io.netty.allocator.numHeapArenas", "2");// 设置Heap Arenas,默认核数*2
复制代码
在surging 代码DotNettyModule的RegisterBuilder方法中添加,如下图所示
2.png

三、ByteBuf 销毁

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

 四,ByteBuf分配处理销毁

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

五,Dump 分析结果

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

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

6.png

 
7.png

 
8.png

 
9.png

七、总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册