在容器中收集診斷
在其他情境中對於診斷 .NET 問題有用的診斷工具,也同樣適用於 Docker 容器中。 不過,某些工具需要特殊步驟才能在容器中運作。 本文涵蓋如何在 Docker 容器中使用收集效能追蹤和收集傾印的工具。
在容器中使用 .NET CLI 工具
這些工具適用於:✔️.NET Core 3.1 SDK 和更新版本
.NET 全域 CLI 診斷工具 (dotnet-counters、dotnet-dump、dotnet-gcdump、dotnet-monitor 和 dotnet-trace) 旨在適用於各種環境,並應該都能直接在 Docker 容器中執行。 因此,對於收集 .NET Core 3.1 或更新版本容器中 .NET 情境診斷資訊,這些工具會是理想選擇。
您也可以從上一個段落的連結下載單一檔案變體,以在沒有 .NET SDK 的情況下安裝這些工具。 這些安裝需要 .NET 執行階段 3.1 版或更新版本的全域安裝,您可以在 .NET 安裝文件中取得下列任何指定的方法,或使用任何官方執行階段容器。
在側車容器中使用 .NET 全域 CLI 工具
如果您希望使用 .NET 全域 CLI 診斷工具來診斷不同容器中的程序,請注意以下額外要求:
- 容器必須共用進程命名空間 (讓 sidecar 容器中的工具可以存取目標容器中的進程)。
- .NET 全域 CLI 診斷工具需要存取 .NET 執行階段寫入的 /tmp 目錄中的檔案,因此必須透過磁碟區掛載在目標容器和側車容器之間共用 /tmp 目錄。 例如,讓容器共用通用磁碟區或 Kubernetes emptyDir 磁碟區,即可完成此作業。 如果您嘗試從 Sidecar 容器使用診斷工具而不共用 /tmp 目錄,您會收到有關「執行不相容 .NET 執行階段」程序的錯誤。
在容器中使用 PerfCollect
本工具適用於:✔️.NET Core 2.1 與更新版本
此 PerfCollect
指令碼適用於收集效能追蹤,而且是收集 .NET Core 3.0 之前追蹤的建議工具。 如果在容器中使用 PerfCollect
,請記住下列需求:
PerfCollect
需要額外的功能,才能執行perf
工具。 所需的最小功能集是PERFMON
和SYS_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_
前置詞。
在側車容器中使用 PerfCollect
如果您希望在一個容器中執行 PerfCollect
,以分析另一個容器中的 .NET 程序,則體驗幾乎是相同的。 差異包括:
- 先前 (
DOTNET_PerfMapEnabled
和DOTNET_EnableEventLog
) 所述的環境變數必須針對目標容器 (不是執行PerfCollect
) 設定環境變數。 - 執行
PerfCollect
的容器必須具備SYS_ADMIN
功能 (不是目標容器)。 - 這兩個容器必須共用進程命名空間。