针对于基于surging的dotnetty组件内存泄漏问题
<h1>一、概述 </h1><p> 前段时间客户碰到基于surging内存泄漏问题,邀请我来现场帮忙解决,对于dotnetty 我一直又爱又恨,因堆外内存<span class="content-right_1THTn">DirectByteBuffer</span><span class="content-right_2s-H4">Chunk </span>中<span class="content-right_1THTn">PoolChunk映射分配的16mb始终无法销毁,后面设置优化了dotnetty 环境变量参数,未在同一线程下导致引用计数出现错乱,从而导致的内存泄漏问题。</span></p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321220231222-339354320.png"></p>
<p> </p>
<p> (木舟物联网平台:http://117.72.121.2:3100 用户:fanly 用户1:fanly12 密码:123456 </p>
<p> 链路跟踪Skywalking V8:http://117.72.121.2:8080/</p>
<p> surging 微服务引擎开源地址:https://github.com/fanliang11/surging(后面surging 会移动到microsurging进行维护)</p>
<p> </p>
<h2>二 、环境变量配置</h2>
<p>我设置以下基于netty 的环境变量,</p>
<div class="cnblogs_code">
<pre>Environment.SetEnvironmentVariable(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">io.netty.allocator.maxOrder</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">5</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调整 chunkSize 的大小,只能设置0-14范围内的值,默认值11</span>
Environment.SetEnvironmentVariable(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">io.netty.allocator.numDirectArenas</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置Direct Arenas,默认核数*2</span>
Environment.SetEnvironmentVariable(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">io.netty.allocator.type</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">unpooled</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不使用内存池</span>
<span style="color: rgba(0, 0, 0, 1)">
Environment.SetEnvironmentVariable(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">io.netty.allocator.numHeapArenas</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置Heap Arenas,默认核数*2</span></pre>
</div>
<p>在surging 代码DotNettyModule的RegisterBuilder方法中添加,如下图所示</p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321222226144-1249892069.png"></p>
<h2>三、ByteBuf 销毁</h2>
<p>surging 在ChannelHandlerAdapter 实例类已经把 ByteBuf进行销毁,如下图所示</p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321222805776-2130894573.png"></p>
<h2> 四,ByteBuf分配处理销毁</h2>
<p> 如果bytebuff分配处理销毁处在不同线程下,会导致引用计数错乱,导致无法销毁,内存泄漏。在ChannelRead方法中不要开启线程处理,比如Task.Run ,可以在pipeline中添加eventExecutor 进行处理,如下图所示</p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321223446312-1091792808.png"></p>
<h2>五,Dump 分析结果</h2>
<p>通过运行一天dump文件进行分析,已经未出现<span class="content-right_1THTn">Chunk的</span>16mb 内存。</p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321223809365-1603304911.png"></p>
<h2> 六、通过链路跟踪Skywalking 来监控是否出现内存性能问题</h2>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321224239667-1032610094.png"></p>
<p> </p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321224356316-1595325566.png"></p>
<p> </p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321224519221-183642350.png"></p>
<p> </p>
<p><img src="https://img2024.cnblogs.com/blog/192878/202503/192878-20250321224709462-1750141733.png"></p>
<h2>七、总结</h2>
<p>因为身体问题,当中休息了一段时间,预估4月初MQTT会接入到木舟物联网平台,到时候会开放各个协议端口以便让大家进行测试。</p><br><br>
来源:https://www.cnblogs.com/fanliang11/p/18786023
頁:
[1]