在 Docker 容器中运行时的 .NET Core 分析

The*_*hod 5 profiling visual-studio docker .net-core asp.net-core

我正在使用 asp.net core 2.2 和 Visual Studio 2019。我的应用程序运行的容器是 Debian(官方 aspnet:2.2 docker 映像之一)

所以我的情况是这样的。我有一个由 4 个在 docker 容器中运行的微服务组成的应用程序,当负载不足时,我发现容器节点上的 CPU 使用率非常高。我想要做的是分析执行代码以了解此资源使用发生的位置。

作为起点,我想我只是在本地开发环境上运行一些分析,只是为了大致了解执行情况。尽管在生产中它在 Kubernetes 中运行,但我确实有一个使用 docker compose 的开发环境,并且我发现 Visual Studio Docker 工具相当不错。

我希望使用一些 Visual Studio 分析工具。我能够在我本地运行的容器之一上安装 VSDBG,并在诊断窗格中使用 VS BUT 连接到它,我看到“诊断工具窗口不支持当前的调试配置”。我还尝试使用 docker compose 从 VS 运行项目,但是当我遇到断点时看到相同的消息。我没有找到太多关于如何做到这一点的信息。

我还尝试使用 perfcollect 进行分析,但是在我生成跟踪并使用 perfviewer 打开它之后,我在尝试查看 cpu 堆栈时遇到了解析错误。仍然不确定那里发生了什么。我确实在他们的github上发现了一个旧的封闭问题,描述了我所看到的内容,但最近有人评论说他们看到的是最新版本,所以也许这是一个回归。

所以..毕竟这..我的问题是这个。上述方法中的任何一种都可行吗?有没有更好的方法来实现这一目标?我对有人成功查看在 linux docker 容器上运行的 .net core 2.2 应用程序的一些代码分析感兴趣的任何方式。我真正想要做的就是能够看到我的代码中执行时间的去向以及消耗了哪些资源。正如我所提到的,当我谷歌搜索时,我没有找到太多东西,而且我似乎一直在碰壁。如果有人对这里的方法有任何建议或方向,我将不胜感激。非常感谢!

小智 7

您是否愿意升级到 .Net Core 3.0(.Net Core 2.2 将在几天内停止支持:12/23/2019

如果您对此持开放态度,则可以利用新工具dotnet-trace,该工具支持在 linux 容器中运行,并可与 Visual Studio 中的工具一起使用。

以下是我用来将其添加到我的项目中的步骤:

  1. 更改您的基础映像以使用 sdk 映像(需要安装该工具)。
  2. 将安装工具添加到镜像中:
RUN dotnet tool install --global dotnet-trace
ENV PATH $PATH:/root/.dotnet/tools
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想将其添加到您的映像中,您可以在正在运行的容器中运行以下命令(只要它基于 SDK 映像):

dotnet tool install --global dotnet-trace
export PATH="$PATH:/root/.dotnet/tools"
Run Code Online (Sandbox Code Playgroud)
  1. 在不调试的情况下启动项目 (Ctrl+F5)

  2. 使用容器工具窗口打开终端窗口

运行命令:

dotnet-trace collect --process-id $(pidof dotnet) --providers Microsoft-DotNETCore-SampleProfiler
Run Code Online (Sandbox Code Playgroud)

完成收集后按 Enter 或 Ctrl+C 结束收集

这将创建一个名为“trace.nettrace”的文件

默认情况下,将在其中创建该文件的 /app 文件夹是映射到您的项目文件夹的卷。您可以在 VS 中从那里打开文件。