コンテナーでの診断の収集

他のシナリオでの .NET 問題の診断に役立つ同じ診断ツールも、Docker コンテナーで動作します。 ただし、一部のツールについては、コンテナーで使用するには特別な手順が必要になります。 この記事では、パフォーマンス トレースとダンプを収集するためのツールを、Docker コンテナーで使用する方法について説明します。

コンテナーで .NET CLI ツールを使用する

これらのツールの適用対象: ✔️ .NET Core 3.1 SDK 以降のバージョン

.NET グローバル CLI 診断ツール (dotnet-countersdotnet-dump dotnet-gcdumpdotnet-monitordotnet-trace) は、さまざまな環境で動作するように設計されており、すべて Docker コンテナーで直接動作するものとなります。 このため、これらのツールは、コンテナー内で .NET Core 3.1 以降を対象とする .NET シナリオにおける診断情報を収集するために推奨されます。

前の段落のリンクから単一ファイルのバリアントをダウンロードすることにより、.NET SDK なしでこれらのツールをインストールすることもできます。 これらのインストールには、.NET ランタイム バージョン 3.1 以降のグローバル インストールが必要です。これは、.NET インストール ドキュメントの所定の方法に従うか、公式のランタイム コンテナーを使用して取得できます。

サイドカー コンテナーで .NET グローバル CLI ツールを使用する

.NET グローバル CLI 診断ツールを使用して別のコンテナーでプロセスを診断する場合は、次の追加要件を考慮する必要があります。

  1. コンテナーで、プロセスの名前空間を共有する必要があります (サイドカー コンテナー内のツールが、ターゲット コンテナー内のプロセスにアクセスできるようにするため)。
  2. .NET グローバル CLI 診断ツールは .NET ランタイムによって /tmp ディレクトリに書き込まれるファイルにアクセスする必要があるため、ボリューム マウントを通してターゲット コンテナーとサイドカー コンテナーの間で /tmp ディレクトリを共有する必要があります。 これは、たとえば、コンテナーで共通のボリュームまたは Kubernetes emptyDir ボリュームを共有することにより、行うことができます。 /tmp ディレクトリを共有せずにサイドカー コンテナーから診断ツールを使用しようとすると、プロセスで "互換性のある .NET ランタイムが実行されていない" というエラーが発生します。

コンテナーで PerfCollect を使用する

このツールの適用対象: ✔️ .NET Core 2.1 以降のバージョン

PerfCollect スクリプトは、パフォーマンス トレースの収集に役に立ち、.NET Core 3.0 より前のトレースを収集する場合に推奨されるツールです。 コンテナーで PerfCollect を使用する場合は、次の要件を考慮してください。

  • PerfCollect には、perf ツールを実行するための追加機能が必要です。 必要な最小限の機能セットは、PERFMONSYS_PTRACE です。 一部の環境では、SYS_ADMIN が必要になります。 必ず必要な機能とともにコンテナーを起動してください。 最小限のセットでうまくいかない場合は、完全なセットで試してみてください。

  • PerfCollect は、開始プロファイリングの対象となるアプリより前に、いくつかの環境変数が設定されていることを必要とします。 これらは、Dockerfile で、またはコンテナーを開始するときに、設定できます。 これらの変数は通常の運用環境では設定されないので、プロファイリング対象のコンテナーを開始するときにだけ追加するのが一般的です。 PerfCollect で必要になる 2 つの変数は次のとおりです。

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

注意

.NET 7 でアプリを実行するとき、前述の環境変数に加え、DOTNET_EnableWriteXorExecute=0 も設定する必要があります。

注意

.NET 6 では、.NET の実行時の動作を構成する環境変数のプレフィックスが、COMPlus_ ではなく DOTNET_ に標準化されています。 ただし、プレフィックス COMPlus_ は引き続き機能します。 以前のバージョンの .NET ランタイムを使用している場合は、環境変数に COMPlus_ プレフィックスをまだ使用する必要があります。

サイドカー コンテナーで PerfCollect を使用する

1つのコンテナーで PerfCollect を実行し 、別のコンテナーで .NET プロセスをプロファイリングする場合、エクスペリエンスはほぼ同じです。 相違点は以下のとおりです。

  • 前述の環境変数 (DOTNET_PerfMapEnabledDOTNET_EnableEventLog) は、(PerfCollect を実行しているものではなく) ターゲット コンテナーに設定する必要があります。
  • (ターゲット コンテナーではなく) PerfCollect を実行するコンテナーに、SYS_ADMIN 機能が必要です。
  • 2 つのコンテナーは、プロセスの名前空間を共有している必要があります。