更新2023-05-04
我们创建了一个逻辑应用程序,每30秒ping一次基本诊断端点并记录结果。我们发现端点通常需要大约300- 400 ms的时间来运行,然后我们看到一个突然的尖峰,它可能需要长达50秒的时间才能返回!
当我们分析日志时,我们发现ThreadPool.PendingWorkItemCount
返回了大约100个项目。在“正常”操作期间,PendingWorkItemCount始终为零。
因此,我们似乎正在经历某种形式的线程池耗尽。
有没有办法追踪这些线是从哪里来的?例如,如果有某种后台进程或定期更新的过期缓存,我们如何跟踪它?
ThreadPool对象提供了非常少的公共方法/属性,使我们能够详细检查这一点。
诊断示例:
{
"start": "2023-05-04T12:17:03.0518943Z",
"end": "2023-05-04T12:17:06.6382781Z",
"threadCount": 8,
"pendingWorkItemCount": 32,
"workerThreads": 32762,
"completionPortThreads": 1000,
"maxWorkerThreads": 32767,
"maxCompletionPortThreads": 1000
}
原始版本
我们的某个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支持提出了一个问题,并等待他们的反馈,但是否有其他人对类似的架构有类似的经验?您是否有任何建议,我们可以查看,任何日志/诊断,我们可以考虑添加到跟踪这个问题可能来自哪里?
1条答案
按热度按时间busg9geu1#
现在问题已经解决了。我们改变了三件事:
1.我们的一个复制副本上的SQL Server层不平衡。虽然英国南部和英国西部都是S4,但我们在S1有第三个副本集。因此,我们删除了第三个副本,因为不需要它。
1.我们决定在Azure刀片中关闭Application Insights。
这三个改动一出,问题立刻就解决了。
不幸的是,由于商业上的限制,我们没有更多的时间来调查这个问题,并找出哪些改变解决了这个问题。希望这能给予有类似问题的人一些进一步研究的东西。