# 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.0` veya 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:
```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`, 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:
```csharp
while (true)
{
var memory = Process.GetCurrentProcess().PrivateMemorySize64;
Console.WriteLine($"Memory Usage: {memory / (1024 * 1024)} MB");
Thread.Sleep(5000); // Log every 5 seconds
}
```
`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ış
```txt
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.
```bash
top -p <pid>
```
**`ps`:** bellek alanlarının tek seferlik bir anlık görüntüsünü yazdır.
```bash
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.
```bash
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.
[[w:(GC.Collect() komutunu üretim kodunda çağırmaktan kaçının; sadece hata ayıklama sırasında kullanın.)]]
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.0 veya 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 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, 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
}
C#
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
Memory Usage: 214 MB
Text
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>
SHELL
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>
SHELL
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 smemsmem -p <pid>
sudo apt install smem
smem -p <pid>
SHELL
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.
Uyarı: GC.Collect() komutunu üretim kodunda çağırmaktan kaçının; sadece hata ayıklama sırasında kullanın.
Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.