c# - 对 Azure 网站上 CPU 使用率攀升进行故障排除

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

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

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

Azure website CPU graph

我强烈怀疑这是我自己的代码中某个地方的问题,但我不知道如何解决它。到目前为止,在我的开发或测试环境中重现此问题的任何尝试都被证明是无效的。几乎所有分析 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 字符串实例 - 这些实例似乎与捆绑子系统以某种方式关联,因此我怀疑它们只是缓存了 ScriptBundleStyleBundle 实例。 )

最佳答案

  1. 尝试从 Visual Studio 远程调试您的网站。
  2. 尝试 https://{sitename}.scm.azurewebsites.net/ProcessExplorer/ ,您可以在其中获取 w3wp 进程的内存转储和 GC 转储。 然后您可以比较 2 个 GC 转储来查找内存泄漏,并使用 Windbg/VS 打开内存转储进行进一步的“离线”调试。

关于c# - 对 Azure 网站上 CPU 使用率攀升进行故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005030/

相关文章:

c# - 调用异步方法时对象引用未设置到对象的实例

sql-server - 我怎样才能找到为什么一些经典的 asp 页面随机需要很长时间才能执行?

azure - 在 Azure 数据工厂中创建字典对象

Azure Function ExecutionContext.InitationId 与 FunctionFilterContext.FunctionInstanceId

c# - 使用 2 个存储过程更新现有记录并仅插入 Datagridview 的新记录

c# - 获取Enterprise Architect包节点的所有子节点

java - Java中顶点/节点权重的DAG最短路径

c - fseek 返回先前位置会比查找新位置更快吗?

Arduino esp8266中的c++函数修改了c文件中生成的 float ,c++函数退出后在c文件中看到乱码

c# - Azure Web PubSub 和服务器之间的身份验证