次の方法で共有


ラボ 2.2 Linux で ProcDump を使用してダンプ ファイルをキャプチャする

適用対象: .NET Core 2.1、.NET Core 3.1、.NET 5

この記事では、ProcDump ツールのインストールと、Linux で ProcDump を使用して .NET Core メモリ ダンプ ファイルをキャプチャする方法について説明します。

前提条件

これらのトラブルシューティング ラボに従う最小要件は次のとおりです。

  • 低 CPU および高 CPU パフォーマンスの問題とクラッシュの問題を示す ASP.NET Core アプリケーション。
  • コア ダンプ ファイルが開かれたときに SOS 拡張機能を読み込むようインストールおよび構成された lldb デバッガー。

このシリーズの前の部分に従っている場合は、次のセットアップを準備しておく必要があります。

  • Nginx は、次の 2 つの Web サイトをホストするように構成されています。
    • 1 つ目は、 myfirstwebsite ホスト ヘッダー (http://myfirstwebsite) を使用して要求をリッスンし、ポート 5000 でリッスンするデモ ASP.NET Core アプリケーションに要求をルーティングします。
    • 2 つ目は、 buggyamb ホスト ヘッダー (http://buggyamb) を使用して要求をリッスンし、ポート 5001 でリッスンする 2 番目の ASP.NET Core サンプル バグのあるアプリケーションに要求をルーティングします。
  • ASP.NET コア アプリケーションは、サーバーが再起動されたとき、またはアプリケーションが応答を停止したときに自動的に再起動するサービスとして実行されている必要があります。
  • Linux ローカル ファイアウォールが有効になっており、SSH トラフィックと HTTP トラフィックを許可するように構成されています。

Note

セットアップの準備ができていない場合は、「Part 2 Core アプリ ASP.NET 作成して実行する」に進みます。

このラボの目標

前のラボでは、クラッシュまたはパフォーマンスの問題を分析する方法を学習しました。 ダンプ ファイルをキャプチャするために createdump ツールを使用しました。

次に、ProcDump をインストールし、ProcDump を使用してコア ダンプ ファイルをキャプチャします。 これは、前のパートで調査したのと同じシナリオで作業するため、このラボの範囲になります。

ProcDump

Linux バージョンの ProcDump の 公式ページによると「ProcDump は、Windows 用ツールの Sysinternals スイートからの従来の ProcDump ツールの Linux 再考です。」

Linux バージョンには、Windows バージョンと比較していくつかの制限があります。 Windows バージョンのツールが提供するすべての機能をサポートしているわけではありません。 たとえば、プロセスがクラッシュしたり、初回例外がスローされたりしたときにコア ダンプ ファイルを収集するように構成することはできません。

しかし、それはまだ強力です。 次のコマンド ライン オプションの一覧は、ツールの強度を証明する上で大きな意味を持つものです。

-C: Trigger core dump generation when CPU exceeds or equals specified value (0 to 100 * nCPU)
-c: Trigger core dump generation when CPU is less than specified value (0 to 100 * nCPU)
-M: Trigger core dump generation when memory commit limit exceeds or equals specified value (MB)
-m: Trigger core dump generation when memory commit limit is less than specified value (MB)
-T: Trigger core dump generation when thread count exceeds or equals specified value.
-F: Trigger core dump generation when filedescriptor count exceeds or equals specified value.

インストール手順の詳細については、 Install ProcDump に関するページを参照してください。 .NET Core をインストールする前に、Microsoft パッケージ リポジトリを追加するように指示されたことを思い出してください。 ProcDump は同じリポジトリを使用します。 そのため、 sudo apt install procdump コマンドを使用してツールを直接インストールできます。

sudo apt install procdump コマンドのスクリーンショット。

ProcDump を使用して、CPU、メモリ、スレッド、またはファイル記述子の使用状況を監視できます。

ProcDump を使用すると、ターゲット プロセスの CPU またはメモリ使用量が特定のしきい値に達するか、制限値を下回ったときにメモリ ダンプ ファイルをキャプチャできます。 ただし、この演習では、最も簡単な方法を使用してツールを呼び出します: procdump -p <PID>。 これにより、プロセスのダンプ ファイルが手動で作成されます。

同じプロセスのメモリ ダンプ ファイルをキャプチャします。 sudoを使用してコマンドを実行する必要があることに注意してください。

sudo procdump コマンドのスクリーンショット。

ProcDump はコア ダンプ ファイルをどこに作成しますか?

これは、確かに知っておく必要がある情報です。 ProcDump を使用してコア ダンプ ファイルをキャプチャするときにダンプ ファイルが作成される場所を知るために多くの時間を費やすことができます。

ProcDump の出力では、コア ダンプ ファイルが作成される場所が明確ではありません。 前のスクリーンショットに示すように、出力ではファイルの名前が書き込まれますが、実際のパスは書き込まれません。

他のツールでは通常、 /tmp/ または /var/lib/systemd/coredump/ ディレクトリが使用されるため、ProcDump でもこれらのディレクトリのいずれかを使用していると考えられます。 ただし、これは当てはまるわけではありません。 代わりに、ProcDump によってキャプチャされたダンプ ファイルは、ASP.NET Core アプリケーションの作業ディレクトリに作成されます。

アプリケーションの作業ディレクトリは、サービス制御ユニット ファイルで定義されます。 次のスクリーンショットでわかるように、サンプル アプリケーションの作業ディレクトリは /var/BuggyAmb_v1.1 です。 したがって、ProcDump がこのアプリケーション用に作成するすべてのダンプ ファイルは、 /var/BuggyAmb_v1.1 ディレクトリに格納されます。

cat and ll コマンドのスクリーンショット。

サンプル シナリオ: メモリ使用量に基づいてダンプ ファイルをキャプチャする

以下のシナリオについて考えてみます。

  • ホストしている ASP.NET Core アプリケーションでメモリ消費量が多くなっています。
  • メモリ消費量が多い場合はランダムに発生し、問題を再現する方法がわからない。 アプリケーションをホストするプロセスのコミット メモリ使用量が 750 MB に達すると、問題が開始されることがわかっているだけです。
  • メモリ使用量を継続的に監視できないため、ダンプ収集プロセスを自動化する必要があります。 目標は、メモリ使用量が 750 MB のしきい値を超えた後に、同じプロセスの 2 つの連続するダンプ ファイルをキャプチャすることです。
  • 2 つのメモリ ダンプ ファイルをキャプチャし、1 番目と 2 番目のメモリ ダンプ ファイルの生成間隔を少なくとも 5 秒に設定します。

ProcDump ヘルプによると、使用する必要があるスイッチを次に示します。

  • -M: メモリのコミットが指定された値 (MB) を超えるか等しい場合に、コア ダンプ ファイルの生成をトリガーします。
  • -n: 終了する前に書き込むコア ダンプ ファイルの数 (既定値は 1)
  • -s: ダンプ ファイルが書き込まれる前の連続した秒数 (既定値は 10)
  • -d: 診断ログを Syslog に書き込む
  • -p: プロセスの PID

sudo procdump -p 11724 -n 2 -s 5 -M 750 コマンドを実行します。 ProcDump は、渡された引数によって定義された条件が満たされるまで、または Ctrl + C キーを押して監視フェーズを終了するまで待機ことがわかります。

sudo procdump p コマンドのスクリーンショット。

ProcDump がメモリ使用量を監視している間は、web アプリケーションのLoad Generator機能を再度使用して、Slow シナリオに 6 つの要求を送信することで、同じ問題を再現します。 メモリ使用量がしきい値に達すると、ProcDump によってダンプ ファイルが作成されます。 次のスクリーンショットは、キャプチャされた 2 つのダンプ ファイルを示しています。

sudo procdump p n コマンドのスクリーンショット。

ダンプ ファイルは、前に作成した手動メモリ ダンプ ファイルの場合と同じように、作業ディレクトリに書き込まれます。

ls コマンドのスクリーンショット。

createdump と ProcDump を使用して作成されるダンプ ファイルは、含まれる情報の点で同じです。 このような問題のトラブルシューティングを行うときに直面するシナリオに適していると思われるツールを選択できます。

次のステップ

ラボ 3 Linux での dotnet-dump に関するパフォーマンスと GC に関する問題のトラブルシューティング

ラボ 3 では、 dotnet-dumpdotnet-gcdumpを使用してメモリ ダンプ ファイルを操作するためのその他のオプションについて説明します。