Linux/WSLで for .NETプロセスメモリの監視

This article was translated from English: Does it need improvement?
Translated
View the article in English

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Thread.Sleep(5000)の呼び出しは、ログを5秒ごとに1回の読み取りにペースします。 出力をファイルまたは別のプロセスにパイプするか、使用がしきい値を超えたときにアラートを発するために使用してください。

コンソール出力

Memory Usage: 214 MB

オプション:Linuxツールで外部から監視

アプリ外部からプロセスを監視するには、標準ユーティリティの1つを使用します。 <pid>はプロセスIDで、オペレーティングシステムが実行中の各プロセスに割り当てるユニークな番号です。

htop: 単一プロセスをライブで監視します。

top -p <pid>
top -p <pid>
SHELL

ps: メモリフィールドのワンショットスナップショットを印刷します。

ps -o pid,vsz,rss,comm -p <pid>
ps -o pid,vsz,rss,comm -p <pid>
SHELL

ここでRSSは常駐セットサイズ、すなわち使用中の物理メモリです。

smem:より詳細なプロセスごとの内訳のためにインストールしてください。

sudo apt install smem
smem -p <pid>
sudo apt install smem
smem -p <pid>
SHELL

ベストプラクティス

  • 本番環境に展開する前にテスト環境でメモリ追跡を実行します。
  • 長時間実行されるサービスやAPIの場合、PrometheusやGrafanaのようなメトリクススタックを統合します。
  • GC.Collect()はデバッグ専用に予約します。

警告本番コードではGC.Collect()を呼び出さないでください; デバッグ中にのみ使用します。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 20,296,129 | バージョン: 2026.7 リリースされたばかり
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronPdf
サンプルを実行するHTML が PDF に変換されるのを確認します。