在Linux/WSL中監控.NET程式記憶體

This article was translated from English: Does it need improvement?
Translated
View the article in English

資源密集型的.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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Thread.Sleep(5000)調用使日誌處理以每五秒進行一次讀取。 將輸出重定向到一個文件或另一個進程,或在用量超過門檻時用於觸發警報。

控制台輸出

Memory Usage: 214 MB

選項:使用Linux工具外部監控

要從應用程式外監看一個進程,請使用標準工具之一。 <pid>是Process ID,作業系統分配給每個正在運行的進程的唯一數字。

htop 實時監看單一進程。

top -p <pid>
top -p <pid>
SHELL

ps 列印記憶體領域的一次性快照。

ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
SHELL

這裡的RSS是駐留集大小,表示使用中的物理記憶體。

smem 安裝它以獲得更詳細的每進程分析。

sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
SHELL

最佳實踐

  • 在部署到生產環境之前,在測試環境中運行記憶體追蹤。
  • 對於長期運行的服務或API,整合一個指標堆棧,如Prometheus或Grafana。
  • 保留GC.Collect()僅用於偵錯。

警告不要在生產程式碼中調用GC.Collect(); 僅在偵錯時使用。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

準備開始了嗎?
Nuget 下載 20,296,129 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想快速獲得證明嗎? PM > Install-Package IronPdf
執行範例 看您的HTML變成PDF。