解读surging 的内存过高的原因

surging · 浏览次数 : 0

小编点评

引言 对于.NET开发人员来说,程序占用内存过高是不合格的,会严重影响用户体验。因此,他们更倾向于使用工作站垃圾收集器而不是服务器垃圾收集器。然而,对于低内存程序,高性能和稳定性更为重要。本文将解决企业在使用Surging服务时遇到的内存泄漏和溢出问题。 问题诊断 在与客户沟通后,他们提供了dump文件进行分析。结果发现,问题出在DotNetty.Buffers.PooledByteBufferAllocator分配的堆内存未进行释放。 内存管理 .NET中的内存管理分为堆内内存和堆外内存。堆内内存由垃圾回收器进行回收,而堆外内存则不会。为了避免频繁触发垃圾回收,提高性能,堆外内存通常用于存储大量消息。在这个案例中,由于消息过大或并发量高,导致堆外内存不断累积。 解决方案 针对这个问题,我们可以采取以下两种解决方案: 1. 追求高性能解决方案:设置最大内存,并使用服务器垃圾收集器。通过添加-- memory参数来指定最大内存,例如:dotnet Surging.Services.Server.dll -- memory 2GB,并启用服务器垃圾收集器:。 True 2. 追求低内存的解决方案:不允许分配堆外内存。可以通过设置ChildOption(ChannelOption.Allocator, new UnpooledByteBufferAllocator(false, true))或修改Donetty参数来禁止分配堆外内存: Environment.SetEnvironmentVariable("io.netty.allocator.numDirectArenas", "0"); 结语 总之,对于需要高性能、多语言异构和跨平台的开发者,可以联系作者,加入QQ群:744677125。希望本文能帮助企业解决内存泄漏和溢出问题,提高程序的性能和稳定性。

正文

前言

       对于.NET开发人员来讲,一个程序占用内存过高,是极其糟糕,是一款不合格的程序软件,.NET开发人员也不会去使用服务器垃圾收集器(ServerGarbageCollection),而是选用工作站垃圾收集器,而是对于一款低内存的程序更能给开发人员是一款稳定运行的程序,而对于今天写这篇文章的目的,源于客户说基于surging的服务内存一直升高,内存泄漏,在这里我可以讲解一下,以解决企业、社区用户的疑问。

是否内存泄漏?

 对于客户反应后,告诉客户把dump发过来,然后通过dump分析发现是DotNetty.Buffers.PooledByteBufferAllocator 分配堆内存未进行释放

 而对于以上的产生的问题, 就要谈到PooledByteBufferAllocator 分配的堆内内存和堆外内存,堆内内存会通过垃圾回收进行回收,而堆外内存是不会通过触发垃圾回收进行回收,而一般是当发送的消息过大,或者并发高产生消息过多都会进入到堆外内存,这样做的目的不频繁触发垃圾回收提高性能。

如何解决问题

而对于以上的问题如何解决呢?

1. 追求高性能解决方案,设置最大内存,使用服务器垃圾收集器(ServerGarbageCollection)

运行以下命令,加--memory 参数
dotnet Surging.Services.Server.dll --memory 2GB
改成服务器垃圾收集器
<PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

2. 追求低内存的解决方案

Allocator设置不分配堆外内存,以下是代码:

.ChildOption(ChannelOption.Allocator, new  UnpooledByteBufferAllocator(false, true)) 

或者是设置以下donetty 参数:

Environment.SetEnvironmentVariable("io.netty.allocator.numDirectArenas", "0");

总结

如果需要企业版本,多语言异构版本,平台版本可以联系作者,QQ群:744677125

与解读surging 的内存过高的原因相似的内容:

解读surging 的内存过高的原因

前言 对于.NET开发人员来讲,一个程序占用内存过高,是极其糟糕,是一款不合格的程序软件,.NET开发人员也不会去使用服务器垃圾收集器(ServerGarbageCollection),而是选用工作站垃圾收集器,而是对于一款低内存的程序更能给开发人员是一款稳定运行的程序,而对于今天写这篇文章的目的,

解读MySQL 8.0数据字典的初始化与启动

本文分享自华为云社区《MySQL全文索引源码剖析之Insert语句执行过程》,作者:GaussDB 数据库。 本文主要介绍MySQL 8.0数据字典的基本概念和数据字典的初始化与启动加载的主要流程。 MySQL 8.0数据字典简介 数据字典(Data Dictionary, DD)用来存储数据库内部

解读注意力机制原理,教你使用Python实现深度学习模型

本文介绍了注意力机制的基本原理,并使用 Python 和 TensorFlow/Keras 实现了一个简单的注意力机制模型应用于文本分类任务。

[转帖]解读两大精简指令集:RISC-V和MIPS

https://www.bilibili.com/read/cv14392730?spm_id_from=333.999.0.0 关注 来源:内容来自「SIMIT战略研究室」,谢谢。 当前CPU的两大架构是CISC(复杂指令集)和RISC(精简指令集),x86是CISC的代表架构,占领了95%以上的

[转帖]解读CPU架构:X86、ARM、MIPS、IRSC-V、CISC

https://www.cnblogs.com/zhangxinglong/p/15019549.html CPU发挥“大脑”的功能,负责数据的处理和运算, CPU 与 GPU 、内存、硬盘和网卡间并不能直接通信,需要通过内存控制芯片、 PCIe 控制芯片和 I/O 处理芯片等实现,这类通信协调芯片

[转帖]解读内核 sysctl 配置中 panic、oops 相关项目

写在前面 本篇文章的内容主要来自内核源码树 Documentation/admin-guide/sysctl/kernel.rst文件。 softlockup vs hardlockup softlockup 是一种触发系统在内核态中一直循环超过 20 秒导致其它任务没有机会得到运行的 BUG。 h

解读Java内存模型中Happens-Before的8个原则

摘要:本文我们就结合案例程序来说明Java内存模型中的Happens-Before原则。 本文分享自华为云社区《【高并发】一文秒懂Happens-Before原则》,作者: 冰 河。 在正式介绍Happens-Before原则之前,我们先来看一段代码。 【示例一】 class VolatileExa

解读Redis常见命令

Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样: 贴心小建议:命令不要死记,学会查询就好啦 Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网:https://redis.io/commands 可以

解读数仓常用模糊查询的优化方法

摘要:本文讲解了GaussDB(DWS)上模糊查询常用的性能优化方法,通过创建索引,能够提升多种场景下模糊查询语句的执行速度。 本文分享自华为云社区《GaussDB(DWS) 模糊查询性能优化》,作者: 黎明的风 。 在使用GaussDB(DWS)时,通过like进行模糊查询,有时会遇到查询性能慢的

解读数仓中的数据对象及相关关系

摘要:为实现不同的功能,GaussDB(DWS)提供了不同的数据对象类型,包括索引、行存表、列存表及其辅助表等。这些数据对象在特定的条件下实现不同的功能,为数据库的快速高效提供了保证,本文对部分数据对象进行介绍。 本文分享自华为云社区《GaussDB(DWS)之数据对象及相互关系总结》,作者:我的橘