# Monitorowanie pamięci procesów .NET w Linux/WSL
Praca .NET wymagająca zasobów, taka jak OCR, generowanie PDF czy przetwarzanie obrazów, może być trudna do wycenienia w ograniczonych środowiskach, takich jak WSL (Windows Subsystem for Linux) lub kontenery Linux. Można rejestrować zużycie pamięci procesu w czasie rzeczywistym bezpośrednio z aplikacji konsolowej lub obserwować go zewnętrznie przy użyciu standardowych narzędzi Linuksa.
## Wymagania wstępne
- Zainstalowane .NET SDK, wersja `5.0` lub nowsza.
- Środowisko Linux, natywne lub poprzez WSL.
- Podstawowa aplikacja konsolowa .NET.
## Rozwiązanie
### 1. Logowanie zużycia pamięci do konsoli
Odczytaj rozmiar prywatnej pamięci procesu i wydrukuj ją w megabajtach:
```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` zwraca ilosc pamieci, w bajtach, ktora proces zarezerwowal wylacznie i nie dzieli sie z innymi procesami. To solidny wskaźnik, jak ciężko działa aplikacja.
### 2. Śledzenie pamięci ciągle
Dla procesu działającego przez długi czas, opakuj odczytywanie w pętlę, aby próbować użycie w czasie:
```csharp
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
```
Wywolanie `Thread.Sleep(5000)` ogranicza logowanie do jednego odczytu co piec sekund. Przekazuj wyjście do pliku lub innego procesu, lub używaj go do włączania alertów, gdy zużycie przekroczy próg.
#### Wynik konsoli
```txt
Memory Usage: 214 MB
```
### Opcja: Monitorowanie zewnętrznie za pomocą narzędzi Linuksa
Aby obserwować proces z zewnątrz aplikacji, użyj jednej z standardowych narzędzi. `<pid>` to ID procesu, unikalny numer przypisywany przez system operacyjny kazdemu uruchomionemu procesowi.
**`top` lub `htop`:** obserwuj na zywo jeden proces.
```bash
top -p <pid>
```
**`ps`:** wydrukuj jednorazowy zrzut pol pamieci.
```bash
ps -o pid,vsz,rss,comm -p <pid>
```
Tutaj `VSZ` to wirtualny rozmiar pamieci w KB, a `RSS` to rozmiar zestawu rezydentnego, fizycznej pamieci w uzyciu.
**`smem`:** zainstaluj, aby uzyskac bardziej szczegolowy podzial na procesy.
```bash
sudo apt install smem
smem -p <pid>
```
## Najlepsze praktyki
- Uruchamiaj śledzenie pamięci w środowiskach testowych przed wdrożeniem do produkcji.
- Dla działających długoterminowo usług lub API, zintegruj stos metryk, takich jak Prometheus lub Grafana.
- Zarezerwuj `GC.Collect()` tylko do debugowania.
[[w:(Nie wywołuj GC.Collect() w kodzie produkcyjnym; używaj tego jedynie podczas debugowania.)]]
Praca .NET wymagająca zasobów, taka jak OCR, generowanie PDF czy przetwarzanie obrazów, może być trudna do wycenienia w ograniczonych środowiskach, takich jak WSL (Windows Subsystem for Linux) lub kontenery Linux. Można rejestrować zużycie pamięci procesu w czasie rzeczywistym bezpośrednio z aplikacji konsolowej lub obserwować go zewnętrznie przy użyciu standardowych narzędzi Linuksa.
Wymagania wstępne
Zainstalowane .NET SDK, wersja 5.0 lub nowsza.
Środowisko Linux, natywne lub poprzez WSL.
Podstawowa aplikacja konsolowa .NET.
Rozwiązanie
1. Logowanie zużycia pamięci do konsoli
Odczytaj rozmiar prywatnej pamięci procesu i wydrukuj ją w megabajtach:
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 zwraca ilosc pamieci, w bajtach, ktora proces zarezerwowal wylacznie i nie dzieli sie z innymi procesami. To solidny wskaźnik, jak ciężko działa aplikacja.
2. Śledzenie pamięci ciągle
Dla procesu działającego przez długi czas, opakuj odczytywanie w pętlę, aby próbować użycie w czasie:
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#
Wywolanie Thread.Sleep(5000) ogranicza logowanie do jednego odczytu co piec sekund. Przekazuj wyjście do pliku lub innego procesu, lub używaj go do włączania alertów, gdy zużycie przekroczy próg.
Wynik konsoli
Memory Usage: 214 MB
Memory Usage: 214 MB
Text
Opcja: Monitorowanie zewnętrznie za pomocą narzędzi Linuksa
Aby obserwować proces z zewnątrz aplikacji, użyj jednej z standardowych narzędzi. <pid> to ID procesu, unikalny numer przypisywany przez system operacyjny kazdemu uruchomionemu procesowi.
top lub htop: obserwuj na zywo jeden proces.
top -p <pid>
top -p <pid>
SHELL
ps: wydrukuj jednorazowy zrzut pol pamieci.
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
SHELL
Tutaj VSZ to wirtualny rozmiar pamieci w KB, a RSS to rozmiar zestawu rezydentnego, fizycznej pamieci w uzyciu.
smem: zainstaluj, aby uzyskac bardziej szczegolowy podzial na procesy.
sudo apt install smemsmem -p <pid>
sudo apt install smem
smem -p <pid>
SHELL
Najlepsze praktyki
Uruchamiaj śledzenie pamięci w środowiskach testowych przed wdrożeniem do produkcji.
Dla działających długoterminowo usług lub API, zintegruj stos metryk, takich jak Prometheus lub Grafana.
Zarezerwuj GC.Collect() tylko do debugowania.
Ostrzeżenie: Nie wywołuj GC.Collect() w kodzie produkcyjnym; używaj tego jedynie podczas debugowania.
Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.