我们有几个使用实体框架和 AutoMapper 的 OData API。它们通过 VNet 连接到本地 SQL 数据库。这个 API 的 GET 请求不是异步的,每个示例在这里找到。缩放设置为 S2。我们一直启用。
有时请求会在 500 毫秒内完成。有时,同样的请求需要 40 秒。我们尝试过向外扩展,但这并没有带来切实的好处。我们已经尝试使控制器上的 GET 函数异步。我们已尝试禁用身份验证。我们尝试在分析器中查看应用程序洞察调用堆栈,但有时代码在一个调用上挂起,而其他时间在另一个调用上。我们甚至发现了对 String.Replace() 的 39 秒调用。我们已经尝试过 Kudu,但似乎无法从中获得任何知识。
最重要的是,我一个人通过在一个相对简单的请求上发送 F5 垃圾邮件,将 CPU 锁定在 100%,成功地使服务器瘫痪。S2 似乎已经很高了,我们很惊讶服务器显然无法处理它。而且服务器上的低 CPU 使用率并不总是等于快速请求。有时这些请求也需要非常多的时间。
我们已经尝试查看应用程序洞察数据,但变得更加困惑,因为一些数据表明一件事有问题,而其他数据表明它没有问题。
应用服务计划的 CPU 使用率很高。
实时指标中的 CPU 使用率通常保持在较低水平。
这表明 SQL 有问题。但是我们几乎已经排除了这种可能性,因为如果我们在一个应用服务计划上向 API 发送垃圾邮件并将相同的单个请求发送到另一个应用服务计划,我们会立即得到结果。
这表明代码或服务器有问题。
我们如何诊断这个问题并找到瓶颈?