针对于基于surging的dotnetty组件内存泄漏问题
一、概述
前段时间客户碰到基于surging内存泄漏问题,邀请我来现场帮忙解决,对于dotnetty 我一直又爱又恨,因堆外内存DirectByteBufferChunk 中PoolChunk映射分配的16mb始终无法销毁,后面设置优化了dotnetty 环境变量参数,避免未在同一线程下导致引用计数出现错乱,从而导致的内存泄漏问题。

(木舟物联网平台:http://117.72.121.2:3100
链路跟踪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会接入到木舟物联网平台,到时候会开放各个协议端口以便让大家进行测试。
针对于基于surging的dotnetty组件内存泄漏问题的更多相关文章
- 记一次 Vue 组件内存泄漏的坑
概述 最近在开发 Vue 项目的时候遇到了内存泄漏问题,记录下来,供以后开发时参考,相信对其他人也有用. 背景 背景是需要用 three.min.js 和 vanta.net.min.js 给首页加上 ...
- 基于surging 的stage组件设计,谈谈我眼中的微服务。
一.前言 随着业务的发展,并发量的增多,业务的复杂度越来越大,对于系统架构能力要求越来越高,这时候微服务的设计思想应运而生,但是对于微服务需要引擎进行驱动,这时候基于.NET CORE 的微服务引擎s ...
- 如何在linux下检测内存泄漏
之前的文章应用 Valgrind 发现 Linux 程序的内存问题中介绍了利用Linux系统工具valgrind检测内存泄露的简单用法,本文实现了一个检测内存泄露的工具,包括了原理说明以及实现细节. ...
- 如何在linux下检测内存泄漏(转)
本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...
- 基于surging网络组件多协议适配的平台化发展
前言 Surging 发展已经有快6年的时间,经过这些年的发展,功能框架也趋于成熟,但是针对于商业化需求还需要不断的打磨,前段时间客户找到我想升级成平台化,针对他的需求我 ...
- 基于HTML5的WebGL应用内存泄露分析
上篇(http://www.hightopo.com/blog/194.html)我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动, ...
- Java安全之基于Tomcat的Filter型内存马
Java安全之基于Tomcat的Filter型内存马 写在前面 现在来说,内存马已经是一种很常见的攻击手法了,基本红队项目中对于入口点都是选择打入内存马.而对于内存马的支持也是五花八门,甚至各大公司都 ...
- 低代码平台--基于surging开发微服务编排流程引擎构思
前言 微服务对于各位并不陌生,在互联网浪潮下不是在学习微服务的路上,就是在使用改造的路上,每个人对于微服务都有自己理解,有用k8s 就说自己是微服务,有用一些第三方框架spring cloud, du ...
- 『神坑』DotNetty 内存泄漏 解决办法
背景 近来在用 DotNetty 实现一个文件上传下载的同步服务. 其中:客户端下载服务端的文件,客户端多次请求,从服务端将文件分片下载下来,追加到本地磁盘. —— 非常简单的代码,都写了几十次了,驾 ...
- 基于vue项目的组件中导入mui框架初始化滑动等效果时需移除严格模式的问题
基于vue项目的组件中导入mui框架初始化滑动等效果时,控制台报错:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties ...
随机推荐
- P1437 敲砖块 题解
题意 在一个凹槽中放置了 \(n\) 层砖块.最上面的一层有 \(n\) 块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示: 14 15 4 3 23 3 ...
- 用领域驱动DDD的方式实现购物车-基于abp一代6.2
废话 之前七七八八看了些DDD相关概念,充血模型.领域事件.领域服务.应用服务等,大致能理解但从未实践.最近在用ABP做个电商模块,尝试用DDD方式来实现购物车功能,感觉还行,下面做个记录. 业务分析 ...
- 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多线程技术的高性能实践
背景 我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统.陆陆续续开发了几年,从一开始的偶有用户尝试,到如今的 QPS 突破 240 次/秒,连接数突破 4000,日请求数接近 1000 ...
- 类的加载与ClassLoader的理解
加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址).所 ...
- [新]Java8的新特性
原文首发在我的博客:https://blog.liuzijian.com/post/86955c3b-9635-47a0-890c-f1219a27c269.html 1.Lambda表达式 lamb ...
- ORACLE多表级联更新( MERGE、UPDATE FROM JOIN替代语句)
方法一:MERGE语句的语法 MERGE INTO 表名 USING 表名/视图/子查询 ON 连接条件 --多个条件注意()括起来 WHEN MATCHED THEN -- 当匹配得上连接条件时 更 ...
- .NET周刊【1月第4期 2025-01-26】
国内文章 低成本高可用方案!Linux系统下SQL Server数据库镜像配置全流程详解 https://www.cnblogs.com/lyhabc/p/18660810/linux-sql-ser ...
- 手把手教你喂养 DeepSeek 本地模型
上篇文章<手把手教你部署 DeepSeek 本地模型>首发是在公众号,但截止目前只有500多人阅读量,而在自己博客园BLOG同步更新的文章热度很高,目前已达到50000+的阅读量,流量是公 ...
- Hetao P1391 操作序列 题解 [ 绿 ] [ 二维线性 dp ]
操作序列:简单的二维 dp. 观察 我们每次操作可以让 \(x\) 变为 \(2x-1\),或者当 \(x\) 为奇数时让 \(x\) 变为 \(\frac{x+1}{2}\). 显然,执行第一种操作 ...
- DeepSeek+AnythingLLM,搭建本地AI知识库,真的太香了!三分钟搞定智能助手,小白也能轻松上手!
1. 痛点暴击:你的知识管理还在原始时代吗? 你是否每次查找文档翻遍文件夹,会议纪要总在关键时刻"失踪"? 别慌!今天揭秘一个"真香"组合--DeepSeek+ ...