收集容器中的诊断

其他场景中用于诊断 .NET 问题的相同诊断工具也适用于 Docker 容器。 但是,某些工具需要特殊步骤才能在容器中运行。 本文介绍如何在 Docker 容器中使用收集性能跟踪和收集转储的工具。

在容器中使用 .NET CLI 工具

这些工具适用于:✔️ .NET Core 3.1 SDK 及更高版本

.NET 全局 CLI 诊断工具(dotnet-countersdotnet-dumpdotnet-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 需要的两个变量是:

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

注意

使用 .NET 7 执行应用时,除设置上述环境变量之外,还必须设置 DOTNET_EnableWriteXorExecute=0

注意

.NET 6 为用于配置 .NET 运行时行为的环境变量标准化前缀 DOTNET_ 而不是 COMPlus_。 但是,COMPlus_ 前缀仍将继续正常工作。 如果使用的是早期版本的 .NET 运行时,则环境变量仍应该使用 COMPlus_ 前缀。

在挎斗容器中使用 PerfCollect

如果要在一个容器中运行 PerfCollect 以在另一个容器中分析 .NET 进程,则体验几乎相同。 不同之处在于:

  • 必须为目标容器(不是运行 PerfCollect 的容器)设置前面所述的环境变量(DOTNET_PerfMapEnabledDOTNET_EnableEventLog)。
  • 运行 PerfCollect 的容器必须具有 SYS_ADMIN 功能(而目标容器则不必)。
  • 这两个容器必须共享进程命名空间