Linux/WSLで for .NETプロセスメモリの監視
OCR、PDF生成、画像処理のようなリソース集約型 for .NET作業は、WSL (Windows Subsystem for Linux) などの制約された環境やLinuxコンテナで形状サイズを比べることができません。 プロセスのメモリ消費をリアルタイムでログすることができ、または標準のLinuxツールを使用して外部から監視することができます。
前提条件
- .NET SDKがインストールされており、バージョン
5.0以降であること。 - Linux環境、ネイティブまたはWSL経由。
- 基本的な.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秒ごとに1回の読み取りにペースします。 出力をファイルまたは別のプロセスにパイプするか、使用がしきい値を超えたときにアラートを発するために使用してください。
コンソール出力
Memory Usage: 214 MB
オプション:Linuxツールで外部から監視
アプリ外部からプロセスを監視するには、標準ユーティリティの1つを使用します。 <pid>はプロセスIDで、オペレーティングシステムが実行中の各プロセスに割り当てるユニークな番号です。
htop: 単一プロセスをライブで監視します。
top -p <pid>
top -p <pid>
ps: メモリフィールドのワンショットスナップショットを印刷します。
ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
ここでRSSは常駐セットサイズ、すなわち使用中の物理メモリです。
smem:より詳細なプロセスごとの内訳のためにインストールしてください。
sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
ベストプラクティス
- 本番環境に展開する前にテスト環境でメモリ追跡を実行します。
- 長時間実行されるサービスやAPIの場合、PrometheusやGrafanaのようなメトリクススタックを統合します。
GC.Collect()はデバッグ専用に予約します。

