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

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

コンテナーでの .NET CLI ツールの使用

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

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

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

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

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

  1. コンテナーで、プロセスの名前空間を共有する必要があります (サイドカー コンテナー内のツールが、ターゲット コンテナー内のプロセスにアクセスできるようにするため)。
  2. .NET Core グローバル CLI 診断ツールを使用するには、.NET Core ランタイムによって /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 の使用

あるコンテナーで PerfCollect を実行し、別のコンテナー内の .NET Core プロセスをプロファイリングする場合、エクスペリエンスはほぼ同じですが、次のような違いがあります。

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