Azure App Service:如何确定哪个进程消耗高 CPU?

Azure App Service: How can I determine which process is consuming high CPU?

更新: 我已经弄明白了。见本题结尾。


我有一个 Azure 应用服务 运行 四个站点。除主要站点外,其中一个站点还有两个部署槽。最近,我发现整个应用服务计划的 CPU 利用率非常高。

深色 o运行ge 线显示 CPU 百分比。这是在重新启动我的所有网站之后,下降到这个水平。

但是,当我查看每个站点报告的 CPU 使用率时,它确实很低。

深蓝线表示CPU时间,基本没什么。我对我所有的网站都这样做了,所有的图表看起来都一样。基本上,似乎是我的 none 个网站导致了这个问题。

一些站点有 Web 作业,所以我查看了日志,但那里的一切 运行 都很好。作业 运行 每隔几个小时就会持续几秒钟。

所以我的问题是:如何确定此 CPU 利用率的来源?任何指针将不胜感激。


更新:感谢下面的回复,我能够更详细地了解正在发生的事情。我最终从 SCM / Kudu 工具中得到了我需要的东西。你可以通过转到 Azure 中的 Web 应用程序并从侧面导航中选择“高级工具”来到达此处。从 Kudu 仪表板中,选择 Process Explorer。总 CPU 时间列中的值没有直接用处,因为它是进程自启动以来 运行 的时间(以秒为单位),可能是几分钟或几天前。

但是,如果您每隔一段时间记录一次该值,您可以查看随时间的变化,并且可能会跳出一个过程。就我而言,这是我的 WebJobs 进程。每 60 秒,这个进程消耗大约 10 秒的处理器时间,仅在一个环境中。

这个 Kudu 仪表板的伟大之处在于,如果您可以在问题实际发生时发现问题,您可以点击 Start Profiling 按钮并捕获诊断会话。然后,您可以在 Visual Studio 中打开它并获得一些关于 CPU 时间花费的详细信息。

为了防止其他人看到类似的问题,我将提供有关我的具体案例的更多详细信息。正如我提到的,我的 WebJobs exe 是罪魁祸首,我发现所有 CPU 时间都花在了 StackExchange.Redis.SocketManager 上,它管理与 Azure Redis 缓存的连接。在我的主要 Web 应用程序中,我按照建议只创建一个连接。但是由于我的 Web 作业偶尔只有 运行,我每次 运行 都会创建一个到 Azure Redis 缓存的新连接,这显然会导致问题。我更改了我的代码以在 WebJob 进程启动时创建一次 Redis 缓存连接,并在任何单个 WebJob 运行s.

时使用现有连接

时间会证明这是否真的解决了问题,但我认为它会。当问题发生时,它总是符合相同的模式:在 运行 好几天之后,我的 CPU 会在大约 12 小时的过程中慢慢上升。我的想法是,每次 WebJob 运行 时,它都会创建一个连接对象,起初不会产生问题,但随着 WebJobs 运行 每隔一两个小时,逐渐累积,直到最后一些达到了临界阈值,CPU 的使用率就会上升。

希望这对外面的人有所帮助。祝福!

也许你应该去 webApp scm?

%yourAppName%.scm.azurewebsites.com;

有一个页面可以显示所有进程,现在在您的网络应用程序上运行。 (类似于控制台 > 进程)。

您也可以转到支持页面(从 scm 右上角)。 你可以在那里找到更多关于你的性能的信息,并进行内存转储(不是为了这个问题,但它对性能问题很有用)。

根据您的描述,我假设您可以利用 Crash Diagnoser 扩展程序在 CPU 使用百分比高于特定值时从您的 Web 应用程序和 WebJobs 捕获转储文件隔离此问题的阈值。更详细的可以参考这个官方blog.