针对于基于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会接入到木舟物联网平台,到时候会开放各个协议端口以便让大家进行测试。

相关推荐
fanly111 天前
凯亚物联网平台发布测试版本
surging microservice·surging
fanly112 天前
基于凯亚物联网平台优化内存和性能
surging microservice·surging
fanly113 天前
凯亚物联网增加MQTT设备功能测试
微服务·surging microservice
fanly1112 天前
如何搭建基于surging的分布式直播流媒体
微服务·surging microservice
fanly1114 天前
凯亚利用直播推流技术请大家看电影
surging microservice·surging
fanly1118 天前
使用的架构是否满足微服务设计思想?
surging microservice·surging
fanly1120 天前
凯亚IOT平台在线测试MQTT接入设备
surging microservice·surging
fanly1123 天前
凯亚物联网平台如何通过MQTT网络组件接入设备
surging microservice·surging
fanly111 个月前
.net clr 8年才修复的BUG,你让我损失太多了
surging microservice
fanly111 个月前
surging 集成SuperSocket预发布版本2.0
surging microservice