一、概述
前段时间客户碰到基于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进行销毁,如下图所示
四,ByteBuf分配处理销毁
如果bytebuff分配处理销毁处在不同线程下,会导致引用计数错乱,导致无法销毁,内存泄漏。在ChannelRead方法中不要开启线程处理,比如Task.Run ,可以在pipeline中添加eventExecutor 进行处理,如下图所示
五,Dump 分析结果
通过运行一天dump文件进行分析,已经未出现Chunk的16mb 内存。
六、通过链路跟踪Skywalking 来监控是否出现内存性能题目
七、总结
因为身体题目,当中休息了一段时间,预估4月初MQTT会接入到木舟物联网平台,到时间会开放各个协议端口以便让大家进行测试。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |