Linux/WSL'de .NET Süreç Hafızasını İzleme
Hafıza açısından yoğun .NET işleri, örneğin OCR, PDF oluşturma veya resim işleme, WSL (Windows Subsystem for Linux) veya Linux konteynerleri gibi kısıtlı ortamlarda boyutlandırılması zor olabilir. Bir sürecin hafıza tüketimini gerçek zamanlı olarak doğrudan bir konsol uygulamasından kaydedebilir veya standart Linux araçlarıyla dışarıdan izleyebilirsiniz.
Gereksinimler
- .NET SDK yüklü, sürüm
5.0veya daha yeni. - Bir Linux ortamı, ya yerel ya da WSL üzerinden.
- Temel bir .NET konsol uygulaması.
Çözüm
1. Konsola hafıza kullanımı kaydet
Sürecin özel hafıza boyutunu okuyun ve megabaytlar cinsinden yazdırın:
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, işlemin münhasır olarak tahsis ettiği ve diğer işlemlerle paylaşmadığı bellek miktarını bayt olarak döndürür. Uygulamanızın ne kadar ağır çalıştığını gösteren sağlam bir gösterge.
2. Hafızayı sürekli olarak izleyin
Uzun süre çalışan bir süreç için, okuma işlemine bir döngü içinde yer verin ve zaman içinde kullanımı örnekleme:
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) çağrısı, her beş saniyede bir okumaya yönelik olarak günlüklemeyi ayarlar. Çıktıyı bir dosyaya ya da başka bir sürece aktaran ya da kullanım bir eşiği geçtiğinde uyarıları tetiklemek için kullanan bir yöntem.
Konsol Çıkış
Memory Usage: 214 MB
Seçenek: Linux araçlarıyla harici olarak izleyin
Uygulama dışındaki bir süreç izlemek için standart yardımcı programlardan birini kullanın. <pid>, İşlem Kimliği, işletim sisteminin her çalışan işleme atadığı benzersiz sayıdır.
top veya htop: tek bir süreci canlı olarak izleyin.
top -p <pid>
top -p <pid>
ps: bellek alanlarının tek seferlik bir anlık görüntüsünü yazdır.
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
Burada VSZ sanal bellek boyutu KB olarak ve RSS yerleşik küme boyutudur, kullanılan fiziksel bellek.
smem: daha ayrıntılı bir işlem başına analiz için yükleyin.
sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
En İyi Uygulamalar
- Bellek izleme işlemini üretime göndermeden önce test ortamlarında çalıştırın.
- Uzun süre çalışan hizmetler veya API'ler için Prometheus veya Grafana gibi bir metrik yığını entegre edin.
- Sadece hata ayıklama için
GC.Collect()ayırın.

