随着我们的 Azure 网站上的负载增加(以及它正在执行的工作的复杂性),我们注意到我们遇到了 CPU 利用率问题。即使流量水平保持相当稳定,CPU 利用率也会在几个小时内逐渐上升。随着时间的推移,如果 Azure 统计数据正确,我们将设法让每个实例获得超过 60 秒的 CPU 时间(不太清楚这是如何工作的),并且响应时间将开始急剧增加。
如果我重新启动网络服务器,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 缓存以及每个重要的异步功能代码路径。)
编辑 2014 年 8 月 5 日 - 我已经尝试了下面的一些建议。但是,当网站真正繁忙时,即 CPU 利用率约为 100%,任何下载小型转储或 GC 转储的尝试都会导致 500 错误,并显示消息“存储空间不足”。我已经多次能够下载小型转储或GC转储,但至少就我所知,它们没有显示任何特别有趣的内容。 (例如,GC 转储中最有趣的事情是六个左右 >100KB 字符串实例 - 这些实例似乎与捆绑子系统以某种方式关联,因此我怀疑它们只是缓存了 ScriptBundle
或 StyleBundle
实例。 )
最佳答案
- 尝试从 Visual Studio 远程调试您的网站。
- 尝试
https://{sitename}.scm.azurewebsites.net/ProcessExplorer/
,您可以在其中获取 w3wp 进程的内存转储和 GC 转储。 然后您可以比较 2 个 GC 转储来查找内存泄漏,并使用 Windbg/VS 打开内存转储进行进一步的“离线”调试。
关于c# - 对 Azure 网站上 CPU 使用率攀升进行故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005030/