【发布时间】: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