Überwachung des .NET-Prozessspeichers in Linux/WSL
Ressourcenintensive .NET-Arbeit, wie OCR, PDF-Erstellung oder Bildverarbeitung, kann in eingeschränkten Umgebungen wie WSL (Windows Subsystem für Linux) oder Linux-Containern schwer zu skalieren sein. Sie können den Speicherverbrauch eines Prozesses in Echtzeit direkt von einer Konsolenanwendung aus protokollieren oder ihn extern mit Standard-Linux-Tools überwachen.
Voraussetzungen
- .NET-SDK installiert, Version
5.0oder später. - Eine Linux-Umgebung, entweder nativ oder über WSL.
- Eine grundlegende .NET-Konsolenanwendung.
Lösung
1. Speichernutzung in der Konsole protokollieren
Lesen Sie die private Speichergöße des Prozesses aus und drucken Sie sie in Megabyte aus:
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 gibt die Menge des Speichers in Byte zurück, die der Prozess ausschließlich belegt und nicht mit anderen Prozessen teilt. Es ist ein solider Indikator dafür, wie stark Ihre Anwendung läuft.
2. Speichern kontinuierlich verfolgen
Für einen langlaufenden Prozess falten Sie das Lesen in eine Schleife ein, um die Nutzung im Laufe der Zeit zu erfassen:
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
Der Thread.Sleep(5000)-Aufruf begrenzt das Logging auf eine Abfrage alle fünf Sekunden. Leiten Sie die Ausgabe an eine Datei oder einen anderen Prozess weiter oder verwenden Sie sie, um Alarme auszulösen, wenn die Nutzung einen Schwellenwert überschreitet.
Konsolenausgabe
Memory Usage: 214 MB
Option: Extern mit Linux-Tools überwachen
Um einen Prozess von außerhalb der Anwendung zu beobachten, verwenden Sie eines der Standard-Utilities. <pid> ist die Prozess-ID, die eindeutige Nummer, die das Betriebssystem jedem laufenden Prozess zuweist.
top oder htop: beobachten Sie einen einzelnen Prozess live.
top -p <pid>
top -p <pid>
ps: Drucken Sie eine einmalige Momentaufnahme der Speicherfelder.
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
Hier ist VSZ die Größe des virtuellen Speichers in KB und RSS ist die Resident Set Size, der physische Speicher in Nutzung.
smem: installieren Sie es für eine detailliertere prozessweise Aufschlüsselung.
sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
Bewährte Verfahren
- Führern Sie die Speicherverfolgung in Testumgebungen durch, bevor Sie die Produktion einsetzen.
- Für langlaufende Dienste oder APIs integrieren Sie einen Metrikstapel wie Prometheus oder Grafana.
- Reservieren Sie
GC.Collect()ausschließlich für das Debugging.

