解讀surging 的記憶體過高的原因

fanly11發表於2024-06-11

前言

對於.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

相關文章