间歇性Azure应用服务“挂起”问题-线程池不足?

mm9b1k5b  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(227)

更新2023-05-04

我们创建了一个逻辑应用程序,每30秒ping一次基本诊断端点并记录结果。我们发现端点通常需要大约300- 400 ms的时间来运行,然后我们看到一个突然的尖峰,它可能需要长达50秒的时间才能返回!
当我们分析日志时,我们发现ThreadPool.PendingWorkItemCount返回了大约100个项目。在“正常”操作期间,PendingWorkItemCount始终为零。
因此,我们似乎正在经历某种形式的线程池耗尽。
有没有办法追踪这些线是从哪里来的?例如,如果有某种后台进程或定期更新的过期缓存,我们如何跟踪它?
ThreadPool对象提供了非常少的公共方法/属性,使我们能够详细检查这一点。
诊断示例:

  1. {
  2. "start": "2023-05-04T12:17:03.0518943Z",
  3. "end": "2023-05-04T12:17:06.6382781Z",
  4. "threadCount": 8,
  5. "pendingWorkItemCount": 32,
  6. "workerThreads": 32762,
  7. "completionPortThreads": 1000,
  8. "maxWorkerThreads": 32767,
  9. "maxCompletionPortThreads": 1000
  10. }

原始版本

我们的某个Azure应用服务遇到了一个奇怪的问题。在一天中各种不可预测的时间点,应用程序会突然出现挂起约30-50秒,没有请求得到服务。就好像我们在等待一个冷的开始。
它是一个ASP.NETMVC.NET7应用程序(C#)单体。它有一个DI服务层,但这不是基于API的--所有这些都包含在一个应用程序中。它广泛使用Azure Redis,并具有Azure SQL后端。它还广泛使用Azure存储(表,Blob和队列)。
该应用程序始终使用async-await模式。实际上应该没有同步调用或任何明显阻塞线程的东西。我们找不到任何可以在任何时间段内“锁定”任何资源的东西。
它不需要调用任何第三方API,我们也不太倾向于使用外部CDN。我们所需要的一切几乎都在所描述的体系结构中。
MVC应用程序在P2V2(210 vCPU,7 GB RAM)上运行,并扩展到两个示例(会话关联打开)。
Redis示例为P1 Premium(6 GB缓存)。
Azure SQL是Standard S4(200 DTU),在英国南部(R/W)和英国西部(R/O)之间进行地理复制。在我们的应用程序中,我们使用这两个连接字符串。只读查询被定向到UK West,更新/删除操作被定向到UK South,从而“负载平衡”SQL服务器。
在“正常”操作期间,应用程序非常快,如在低ms范围内。但是,由于无法识别的原因,应用程序每天会有几次(可能是5次)突然在两个示例上“挂起”长达50秒。在此期间,浏览器旋转,似乎没有发生任何事情。然后,突然之间,请求得到了服务,它又恢复了出色的性能。这就好像应用程序是“冷启动”,但它不是-我们使用它完美的秒前。
在此期间,我们检查了尽可能多的诊断源,但没有发现任何指向这种突然挂起的信息,例如:

  • 两台计算机上的应用服务CPU指标均未超过15%
  • 内存使用没有突然激增
  • SQL服务器DTU%在R/W和R/O服务器上的这些时间段内通常为5-15%
  • Redis内存使用没有峰值,并且仅在200 MB区域
  • Redis服务器负载通常为5-6%
  • Azure存储数据中的Ingress或Egress没有峰值
  • 与Application Insights无关
  • 错误、警告等没有峰值。
  • 诊断事件日志中没有任何相关信息
  • 没有超时或任何其他延迟问题,我们可以找到
  • 没有后台、计划或定时更新/CRON作业正在运行
  • 数据库查询得到优化并建立了良好的索引
  • 健康检查保持在100%
  • 根据Azure日志,示例不会重新启动。正常运行时间保持在100%

在这个阶段,架构的所有部分都很好地超出了我们的需求。
没有其他明显的架构可以让我们指出,比如防火墙等。
这个问题感觉是MVC、.NET或App Service本身的“内部”问题。我们无法在开发中复制本地问题,也无法预测何时会在生产中发生。
我们已经考虑了GC收集或潜在的数据库连接池回收等。但没有发现任何数据表明这些事情是问题。
有没有可能是Application Insights本身导致了这个问题?是否定期转储或刷新数据/缓存?感觉就像是平台、主机或框架中的某些东西导致了这种情况。
我们有点困惑。这是令人沮丧的,因为除了这些短暂的尖峰全天,应用程序运行得非常好,超级快。
我已经向Azure支持提出了一个问题,并等待他们的反馈,但是否有其他人对类似的架构有类似的经验?您是否有任何建议,我们可以查看,任何日志/诊断,我们可以考虑添加到跟踪这个问题可能来自哪里?

busg9geu

busg9geu1#

现在问题已经解决了。我们改变了三件事:

  1. SignalR -我们没有在App Service配置中激活WebSockets选项。在我们这样做之前,我们看到了大量的请求。有关详细信息,请参阅此问题:与应用程序的其余部分相比,SignalR请求数量较多
    1.我们的一个复制副本上的SQL Server层不平衡。虽然英国南部和英国西部都是S4,但我们在S1有第三个副本集。因此,我们删除了第三个副本,因为不需要它。
    1.我们决定在Azure刀片中关闭Application Insights。
    这三个改动一出,问题立刻就解决了。
    不幸的是,由于商业上的限制,我们没有更多的时间来调查这个问题,并找出哪些改变解决了这个问题。希望这能给予有类似问题的人一些进一步研究的东西。

相关问题