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