# Ü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.0` oder 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:
```csharp
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");
}
}
```
`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:
```csharp
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
```
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
```txt
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.
```bash
top -p <pid>
```
**`ps`:** Drucken Sie eine einmalige Momentaufnahme der Speicherfelder.
```bash
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.
```bash
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.
[[w:(Rufen Sie GC.Collect() nicht in Produktionscode auf; verwenden Sie es nur während des Debuggens.)]]
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.0 oder 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 voidMain(string[] args){// Trigger your memory-consuming logic here (e.g., OCR, PDF generation, etc.)// Log memory usageProcess currentProcess = Process.GetCurrentProcess();long memorySize = currentProcess.PrivateMemorySize64; // In bytesConsole.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");
}
}
C#
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
}
C#
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
Memory Usage: 214 MB
Text
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>
SHELL
ps: Drucken Sie eine einmalige Momentaufnahme der Speicherfelder.
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
SHELL
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 smemsmem -p <pid>
sudo apt install smem
smem -p <pid>
SHELL
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.
Warnung: Rufen Sie GC.Collect() nicht in Produktionscode auf; verwenden Sie es nur während des Debuggens.
Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.