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

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922

一、概述 

       前段时间客户碰到基于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 的情况变量,
  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方法中添加,如下图所示

三、ByteBuf 销毁

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

 四,ByteBuf分配处理销毁

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

五,Dump 分析结果

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

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


 

 

 

七、总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

愛在花開的季節

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表