在Linux/WSL中監控.NET程式記憶體
資源密集型的.NET工作,如OCR、PDF生成或圖像處理,在WSL(Windows Subsystem for Linux)或Linux容器等受限環境中可能很難進行規模擴展。 您可以直接從控制臺應用程式中實時記錄進程的記憶體消耗,或使用標準Linux工具在外部監視它。
先決條件
- 已安裝.NET SDK,版本為
5.0或更高。 - 一個Linux環境,可以是本機或通過WSL。
- 一個基本的.NET控制臺應用程式。
解決方案
1. 將記憶體使用情況記錄到控制臺
讀取過程的私有記憶體大小並以MB為單位列印它:
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)
// Log memory usage
Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64; // In bytes
Console.WriteLine($"Memory Usage: {memorySize / (1024 * 1024)} MB");
}
}
using System;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
// Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)
// Log memory usage
Process currentProcess = Process.GetCurrentProcess();
long memorySize = currentProcess.PrivateMemorySize64; // In bytes
Console.WriteLine($"Memory Usage: {memorySize / (1024 * 1024)} MB");
}
}
Imports System
Imports System.Diagnostics
Class Program
Shared Sub Main(ByVal args As String())
' Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)
' Log memory usage
Dim currentProcess As Process = Process.GetCurrentProcess()
Dim memorySize As Long = currentProcess.PrivateMemorySize64 ' In bytes
Console.WriteLine($"Memory Usage: {memorySize / (1024 * 1024)} MB")
End Sub
End Class
PrivateMemorySize64返回的記憶體量,以字節為單位,是進程獨占且不與其它進程共享的記憶體。 這是一個測量您應用程式運行負荷的可靠指標。
2. 持續追蹤記憶體
對於長時間運行的過程,在一個迴圈中包裝讀取操作,以便在一定時間內對用量進行取樣:
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
Imports System.Diagnostics
Imports System.Threading
While True
Dim memory = Process.GetCurrentProcess().PrivateMemorySize64
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB")
Thread.Sleep(5000) ' Log every 5 seconds
End While
Thread.Sleep(5000)調用使日誌處理以每五秒進行一次讀取。 將輸出重定向到一個文件或另一個進程,或在用量超過門檻時用於觸發警報。
控制台輸出
Memory Usage: 214 MB
選項:使用Linux工具外部監控
要從應用程式外監看一個進程,請使用標準工具之一。 <pid>是Process ID,作業系統分配給每個正在運行的進程的唯一數字。
htop: 實時監看單一進程。
top -p <pid>
top -p <pid>
ps: 列印記憶體領域的一次性快照。
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
這裡的RSS是駐留集大小,表示使用中的物理記憶體。
smem: 安裝它以獲得更詳細的每進程分析。
sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
最佳實踐
- 在部署到生產環境之前,在測試環境中運行記憶體追蹤。
- 對於長期運行的服務或API,整合一個指標堆棧,如Prometheus或Grafana。
- 保留
GC.Collect()僅用於偵錯。

