【问题标题】:Azure App Services suddenly pegging at 100% CPUAzure 应用服务突然与 100% CPU 挂钩
【发布时间】:2017-03-13 14:08:27
【问题描述】:

这是我间歇性遇到的一个问题,但当它发生时,我的所有应用服务都被关闭了,这让付费使用它们的客户非常不满。

今天凌晨 4 点(当时没有人使用任何应用),应用服务计划中的 CPU 从 2% 跃升至 100% 并一直保持到早上 7 点左右,当时我登录门户并停止了所有应用服务:

从上图中可以看出,跳跃似乎与新实例的存在相吻合 - 图表上方有两个 RD000... 选项卡。这是否意味着 Azure 已经启动了一个新的实例/服务器并将我的应用程序转移到它上面?我没有将 Scale Out 设置为自动缩放,所以我的应用应该只存在于一个实例上。

如果是这样,那么我的应用程序(一个计划中只有 8 个)是否必须再次“预热”并以某种方式卡在 100% 上?

如果我停止每个应用程序,然后一次缓慢地打开它们,那么一切都会重新开始工作,但如果我打开它们太快,那么它们最终会再次固定在 100%。

这也会在白天随机发生(尽管通常只针对一个应用)。以下是当天晚些时候某个应用的 CPU 图表示例:

同样,如果我停止应用程序然后重新启动它,一旦加载它就会按预期运行。

该应用程序是一个 ASP.NET MVC4 应用程序,使用 NHibernate 作为其 ORM 到 Azure SQL DB 并且它使用 Redis 作为其会话状态提供程序。它没有运行任何网络作业。

我完全不知道如何确定这些问题的原因。

更新

根据 David 下面的建议,我下载了一个 100% 的转储文件,现在我正在尝试使用 WinDbg 对其进行调试。

所以我正在加载 X86 版本的 WinDbg,因为我的 webapp 平台设置为 32 位。我不能用

!loadby sos clr

因为它正在寻找 D:\ 驱动器中的文件 - 我假设因为转储来自应用程序映射到 D:\ 的 Azure VM - 所以我使用的是:

!load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll

这告诉我:

----------------------------------------------------------------------------
The user dump currently examined is a minidump. Consequently, only a subset
of sos.dll functionality will be available. If needed, attaching to the live
process or debugging a full dump will allow access to sos.dll's full feature set.
To create a full user dump use the command: .dump /ma <filename>
----------------------------------------------------------------------------

然后我尝试运行 !runaway,它抱怨:

ERROR: !runaway: extension exception 0x80004002.
"Unable to get thread times - dumps may not have time information"

是 Kudu 产生没有线程时间的转储,还是我做错了什么?我试过用谷歌搜索这个问题,但大多数建议建议将 dbghelp.dll 复制到与 procdump 相同的文件夹中,这显然是我做不到的。

更新 2(3 月 30 日)

所以 CPU 在今天凌晨 4 点左右再次跃升至 100% 并保持在那里。当我登录并进行转储时,我注意到它似乎不是 w3wp.exe 进程正在吞噬 CPU,而是两个 VBCSCompiler 进程:

该应用程序是我使用 msbuild 部署的 MVC 应用程序,因此我只能假设 VBCSCompiler 正在编译 App_Code 中的视图和文件。当我停止每个站点并交错启动它们时,让每个站点有时间加载,一切正常,但同时启动它们,整个事情都锁定在 100% 的 CPU 中。我有两个问题:

  1. 如何确定 VBCSCompiler 卡在 100% 的原因是什么?

  2. 有没有办法在部署之前使用 msbuild 编译视图,从而不需要 VBCSCompiler?

【问题讨论】:

    标签: azure azure-web-app-service


    【解决方案1】:

    应用服务偶尔会将应用移动到其他虚拟机,例如在平台升级时。

    这可以解释短暂的冷启动,但您所描述的是 CPU 固定在 100% 的 3 小时以上的情况,并且有更严重的事情会导致这种情况。我的猜测是,由于某种原因,您的应用陷入了无限 CPU 循环。

    调查此问题的最佳方法是下载该过程的完整转储,并在本地进行分析。

    【讨论】:

    • 我什至不知道从哪里开始 - 你能指出一些关于如何分析进程转储的文章的正确方向吗?
    • 如果你转到Kudu UI,然后是进程资源管理器选项卡,你可以右键单击一个进程并获得一个转储。然后在 VS 或 windbg 中打开它并查看各种线程的堆栈跟踪,以尝试查看可能占用 CPU 的内容。
    • 好的,我已经下载了一个 100% 的转储文件,我已将其加载到我的解决方案中并单击 Debug With Mixed,我现在看到一个窗口显示:您的应用程序已进入中断状态,但没有代码显示,因为所有线程都在执行外部代码(通常是系统或框架代码)。如何从那里查看堆栈跟踪?
    • 不是 vbcscompiler 方面的专家(那里似乎是个问题),但可以尝试的一件事是将最新的 Microsoft.Net.Compilers NuGet 添加到您的项目中,这应该会让您使用更新的编译器(更多详情here)。也许新的没有这个问题。
    • 这似乎成功了——感谢大卫的所有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多