在容器中收集診斷

診斷其他案例中 .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 安裝文件中取得下列任何指定的方法,或使用任何官方執行階段容器。

在 Sidecar 容器中使用 .NET Core 全域 CLI 工具

如果您想要使用 .NET Core 全域 CLI 診斷工具來診斷不同容器中的程序,請記住下列額外需求:

  1. 容器必須共用進程命名空間 (讓 sidecar 容器中的工具可以存取目標容器中的進程)。
  2. .NET Core 全域 CLI 診斷工具需要存取 .NET Core 執行階段寫入 /tmp 目錄的檔案,因此必須透過磁碟區掛接在目標與 Sidecar 容器之間共用 /tmp 目錄。 例如,讓容器共用通用磁碟區或 Kubernetes emptyDir 磁碟區,即可完成此作業。 如果您嘗試從 Sidecar 容器使用診斷工具而不共用 /tmp 目錄,您會收到有關「執行不相容 .NET 執行階段」程序的錯誤。

在容器中使用 PerfCollect

本工具適用於:✔️.NET Core 2.1 與更新版本

PerfCollect 指令碼適用於收集效能追蹤,而且是收集 .NET Core 3.0 之前追蹤的建議工具。 如果在容器中使用 PerfCollect,請記住下列需求:

  • PerfCollect 需要額外的功能,才能執行 perf 工具。 所需的最小功能集是 PERFMONSYS_PTRACE。 某些環境需要 SYS_ADMIN。 務必使用必要的功能來啟動容器。 如果最小集合無法運作,則嘗試使用完整集合。

  • PerfCollect 需要先設定一些環境變數,再開始分析應用程式。 這些可以在 Dockerfile 中設定,或在啟動容器時設定。 由於這些變數不應該在一般生產環境中設定,因此在啟動將剖析的容器時,通常會只新增這些變數。 PerfCollect 需要的兩個變數如下:

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

注意

使用 .NET 7 執行應用程式時,除了上述環境變數之外,您也必須設定 DOTNET_EnableWriteXorExecute=0

注意

.NET 6 會針對設定 .NET Runtime 行為的環境變數,透過前置詞 DOTNET_ (而非 COMPlus_) 進行標準化。 不過,COMPlus_ 前置詞將繼續運作。 如果使用舊版的 .NET 執行階段,則您仍應對環境變數使用 COMPlus_ 前置詞。

在 Sidecar 容器中使用 PerfCollect

如果您想要在一個容器中執行 PerfCollect,以分析不同容器中的 .NET Core 進程,除了下列差異外體驗幾乎相同:

  • 先前 (DOTNET_PerfMapEnabledDOTNET_EnableEventLog) 所述的環境變數必須針對目標容器 (不是執行 PerfCollect) 設定環境變數。
  • 執行 PerfCollect 的容器必須具備 SYS_ADMIN 功能 (不是目標容器)。
  • 這兩個容器必須共用進程命名空間