[英].NET CORE API application timeout exception hosted in Microsoft Azure (Redis cache, SQL, .NET Core)
我有以下基础结构:.NET Core 3.1 API,它托管在 VNet 中。 在 VNet 内部,我们有 8 台带有负载均衡器 + SQL Server + Redis 缓存的服务器。
我们在登录操作(这不是轻量级操作)上运行 API 负载测试每秒 1200 次操作。 此时所有服务器上的负载为 5-10%。 但问题是我们遇到了 API 超时和 Redis 超时问题。
好像有什么东西阻塞了我们的线程
这是来自我的 Startup.cs(我们正在尝试使用该值,但没有成功):
var threadCount = 2000;
ThreadPool.GetMaxThreads(out _, out var completionThreads);
ThreadPool.SetMinThreads(threadCount, completionThreads);
这是来自 *.csproj 文件:
<PropertyGroup>
<ThreadPoolMinThreads>315</ThreadPoolMinThreads>
Update1-> Redis 问题信息添加
Redis 错误:StackExchange.Redis.RedisTimeoutException:等待响应超时(出站=0KiB,入站=0KiB,10008 毫秒已过,超时为 10000 毫秒),命令=GET,下一个:SET key_digievents____freeevent_4072,inst:0,qu:0,qs: aw: False, rs: ReadAsync, ws: Idle, in: 2197285, in-pipe: 0, out-pipe: 0, serverEndpoint: 10.0.0.34:6379, mc: 1/1/0, mgr: 10 of 10 available , clientName: akssocial27apiapp-xkkb4, IOCP: (Busy=0,Free=1000,Min=1000,Max=1000), WORKER: (Busy=430,Free=32337,Min=315,Max=32767), v: 2.1 .58.34321 StackExchange.Redis.RedisTimeoutException:等待响应超时(出站=0KiB,入站=0KiB,10008ms已过,超时为10000ms),命令=GET,下一个:SET key_digievents____freeevent_4072,inst:08,qsaw: : False, rs: ReadAsync, ws: Idle, in: 2197285, in-pipe: 0, out-pipe: 0, serverEndpoint: 10.0.0.34:6379, mc: 1/1/0, mgr: 10 of 10 available,客户名称:akssocial27apiapp-xkkb4,IOCP:(忙碌=0,空闲=1000,最小值=1000,最大值=1000),工人:(忙碌=430,空闲=32337,最小值=315,M ax=32767), v: 2.1.58.34321 在 Datadog.Trace.ClrProfiler.Integrations.StackExchange.Redis.ConnectionMultiplexer.ExecuteAsyncImplInternal[T](对象多路复用器,对象消息,对象处理器,对象状态,对象服务器,Func`6 originalMethod)
我会很高兴的任何建议。 提前致谢。
很多人在升级到2.x时遇到TimeoutException
https://github.com/StackExchange/StackExchange.Redis/issues/1226
此解决方案可能对您有所帮助: 您是否在超时异常中看到大量的 busyio 或 busyworker 线程?
在帖子的最后,它说:
在 .Net Core 中,根据环境/注册表配置旋钮,添加环境变量 COMPlus_ThreadPool_ForceMinWorkerThreads 以覆盖默认的 MinThreads 设置 - 您也可以使用与上述相同的 ThreadPool.SetMinThreads() 方法。
下面是我附上关于我提出的问题的笔记的文字。 我希望这可以帮助某人并节省大量时间。
首先,我们没有异常/错误/报告带宽是 Azure 基础架构中的瓶颈。 这只是我们的假设。 但是为了反驳这种假设,我们大幅增加了容量,甚至 MS Azure 团队都说我们过度配置而不是我们的使用量。 所以带宽从来都不是问题。 这是限制:
StackExchangeRedis Nuget 包,尤其是当它处理更多数据字节时。
分析表明,我们正在为该页面不需要的页面调用许多不必要的端点或数据。
因此,作为我的 POV,我们需要弄清楚如何使用 StackExchangeRedis 包来处理最少且仅必要的数据以及如何减少对 FE 上不需要的端点的调用等的优化。
我的队友曾与开发 StachExchangeRedis 的人保持联系。 开发人员承认,对于庞大的数据块,它具有局限性。 他还告诉我们,我们并不是唯一遇到此问题的人。
因此,经过所有讨论,我们优化了对 GET/SET 操作的调用。 它允许我们以更精确和有效的方式处理数据字节,以便必要的端点切断所有不需要的端点和呼叫。 我们还在后端实现了某种压缩。
最后,我们添加了额外的区域,使我们能够改善当前的情况。
尽管如此,我们正在考虑跳过使用 Redis 并转向 NoSQL 解决方案。 我们将一次解决几个问题——缓存问题和实时数据+大数据的SQL限制(到目前为止,这只是一个想法层面)
PS影响Redis性能的因素:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.