Linux/WSL에서 .NET 프로세스 메모리 모니터링
OCR, PDF 생성, 이미지 처리와 같은 리소스 밀집형 .NET 작업은 WSL(Windows Subsystem for Linux) 또는 Linux 컨테이너와 같은 제한된 환경에서 크기를 측정하기 어렵습니다. 콘솔 애플리케이션에서 실시간으로 프로세스의 메모리 사용량을 로그로 남길 수 있으며, 또는 표준 Linux 도구를 사용하여 외부에서 감시할 수 있습니다.
필수 조건
- .NET SDK가 설치되어 있으며 버전
5.0이상. - 네이티브 또는 WSL을 통한 Linux 환경.
- 기본 .NET 콘솔 앱.
해결책
1. 메모리 사용량을 콘솔에 로깅
프로세스의 개인 메모리 크기를 읽어 메가바이트로 출력하세요:
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 는 프로세스가 독점적으로 할당하고 다른 프로세스와 공유하지 않는 메모리의 양(바이트)을 반환합니다. 이는 애플리케이션이 얼마나 무겁게 실행되고 있는지에 대한 확실한 지표입니다.
2. 메모리 지속적으로 추적
장기 실행 프로세스의 경우, 사용 샘플을 시간 경과에 감지하기 위해 읽기를 루프에 감쌉니다:
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) 호출은 로깅을 5초에 한 번씩 읽도록 속도를 조절합니다. 출력을 파일 또는 다른 프로세스로 파이프하거나, 사용량이 임계치를 초과할 때 경고를 발생시키는 데 사용할 수 있습니다.
콘솔 출력
Memory Usage: 214 MB
옵션: Linux 도구를 사용하여 외부에서 모니터링
앱의 외부에서 프로세스를 감시하려면 표준 유틸리티 중 하나를 사용하세요. <pid> 는 프로세스 ID로, 운영 체제가 각 실행 중인 프로세스에 할당하는 고유 번호입니다.
top 또는 htop: 단일 프로세스를 실시간으로 관찰합니다.
top -p <pid>
top -p <pid>
ps: 메모리 필드의 일회성 스냅샷을 출력합니다.
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
여기서 VSZ 는 KB 단위의 가상 메모리 크기이고 RSS 는 사용 중인 물리적 메모리인 상주 세트 크기입니다.
smem: 보다 자세한 프로세스별 분석을 위해 설치하세요.
sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
모범 사례
- 배포 전에 테스트 환경에서 메모리 추적을 실행하세요.
- 장시간 실행 서비스 또는 API의 경우 Prometheus 또는 Grafana와 같은 메트릭스를 통합하세요.
GC.Collect()을 디버깅에만 예약하세요.

