针对于基于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进行销毁,如下图所示

四,ByteBuf分配处理销毁

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

五,Dump 分析结果

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

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

七、总结

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

相关推荐
fanly1110 天前
线上测试木舟物联网平台之如何通过HTTP网络组件接入设备
surging microservice
fanly1111 天前
线上测试木舟平台发布
surging microservice
fanly114 个月前
基于surging的木舟平台如何分布式接入设备
surging microservice
fanly114 个月前
基于木舟平台浅谈surging 的热点KEY的解决方法
surging microservice
fanly114 个月前
基于surging的木舟平台如何构建起微服务
surging microservice
fanly114 个月前
基于surging 的木舟平台如何通过Tcp或者UDP网络组件接入设备
surging microservice
fanly115 个月前
基于surging 的木舟平台如何通过HTTP网络组件接入设备
surging microservice
fanly115 个月前
基于surging的木舟平台如何上传模块热部署
surging microservice
fanly117 个月前
基于surging 如何利用peerjs进行语音视频通话
surging microservice