【问题标题】:Troubleshooting creeping CPU utilization on Azure websites排查 Azure 网站上 CPU 利用率上升的问题
【发布时间】:2014-07-28 21:57:47
【问题描述】:

随着我们 Azure 网站上的负载增加(以及它所做工作的复杂性),我们注意到我们遇到了 CPU 利用率问题。即使流量水平保持相当稳定,CPU 利用率也会在几个小时内逐渐上升。随着时间的推移,如果 Azure 统计数据正确,我们将设法使每个实例的 CPU 时间超过 60 秒(不太清楚它是如何工作的),并且响应时间将开始显着增加。

如果我重新启动 Web 服务器,CPU 会立即下降,然后开始缓慢回升。例如,在下图中,您可以看到 CPU 爬升,然后重新启动(带有红色圆圈),然后 CPU 恢复。

我强烈怀疑这是我自己代码中某处的问题,但我正在摸索如何解决这个问题。到目前为止,任何在我的开发或测试环境中重现这一点的尝试都被证明是无效的。几乎所有关于 IIS/C# 性能分析的建议似乎都假定直接访问相关机器或至少是“云服务”实例而不是 Azure 网站。

我知道这有点远,但是...有任何建议,无论是关于它可能是什么,或者如何解决它?

(我们使用 C# 5.0、.NET 4.5.1、ASP.NET MVC 5.2.0、WebAPI 2.2、EF 6.1.1、Azure 系统总线、Azure SQL 数据库、Azure redis 缓存和异步代码路径。)

编辑 8/5/14 - 我尝试了以下一些建议。但是当网站真的很忙时,即 CPU 利用率约为 100%,任何尝试下载 mini-dump 或 GC 转储都会导致 500 错误,并显示消息“存储空间不足”。在我能够下载小型转储或 GC 转储的各种时间里,至少据我所知,它们并没有显示出任何特别有趣的东西。 (例如,GC 转储中最有趣的事情是半打左右 >100KB 的字符串实例 - 这些似乎以某种方式与捆绑子系统相关联,所以我怀疑它们只是缓存了 ScriptBundle 或 @ 987654323@ 个实例。)

【问题讨论】:

  • 你能远程调试吗?暂停调试器 10 次。它会在代码花费最多的地方停止。
  • 任何线程、定时器、并发,...?有后台工作吗?任何静态状态(静态变量、Application.Items、...)?
  • @usr - 今晚晚些时候我会尝试一些远程调试,届时影响会小一些。至于静态,是的,我有一些 - 主要用于日志记录(使用 NLog)。我认为它可能是我发现深埋在一些旧代码中的 EF DbContext 的静态实例,但我将其修复为收效甚微。目前正在审查任何后台任务。
  • 这可能是恶意后台工作堆积或共享数据结构填满。

标签: c# performance azure azure-web-app-service


【解决方案1】:
  1. 尝试从 Visual Studio 对您的站点进行远程调试。
  2. 试试https://{sitename}.scm.azurewebsites.net/ProcessExplorer/,在那里你可以对你的w3wp进程进行内存转储和GC转储。 然后您可以比较 2 个 GC 转储以查找内存泄漏,并使用 windbg/VS 打开内存转储以进行进一步的“离线”调试。

【讨论】:

  • 我不知道它可用。干得好,Kudu 团队。到目前为止我发现的一个问题 - 当我在 VS 中打开生成的迷你转储时,它似乎没有选择我的本地调试符号。有什么好方法可以实现吗?
  • 只是跟进,我想我最终找到了问题(它是我添加的一个属性来过滤掉一些垃圾邮件 IP 地址)。我永远无法让远程调试或内存转储工作正常,但 GC 转储最终为我指明了正确的方向。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-11-22
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多