Microsoft Azure中托管的.NET CORE API应用程序超时异常Redis缓存,SQL,.NET Core

问题描述

我具有以下基础结构: .NET Core 3.1 API,该API托管在VNet中。在VNet内部,我们有8台服务器,这些服务器带有负载平衡器+ SQL Server + Redis缓存。

我们在登录操作(不是轻量级操作)上每秒运行1200次API负载测试。目前,所有服务器上的负载为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,经过10008ms,超时为10000ms),命令= GET,下一条:SET key_digievents____freeevent_4072,inst:0,qu:0,qs:684,aw:False ,rs:ReadAsync,ws:空闲,输入:2197285,管道内:0,管道外:0,服务器端点:10.0.0.34:6379,mc:1/1/0,mgr:10 of 10 available,clientName: akssocial27apiapp-xkkb4,IOCP:(忙= 0,免费= 1000,最小= 1000,最大= 1000),工作人员:(忙= 430,免费= 32337,最小= 315,最大= 32767),v:2.1.58.34321 StackExchange.Redis.RedisTimeoutException:等待超时的响应(出站= 0KiB,入站= 0KiB,经过10008ms,超时为10000ms),命令= GET,下一条:SET key_digievents____freeevent_4072,inst:0,qu:0,qs:684,aw:False ,rs:ReadAsync,ws:空闲,输入:2197285,管道内:0,管道外:0,服务器端点:10.0.0.34:6379,mc:1/1/0,mgr:10 of 10 available,clientName: akssocial27apiapp-xkkb4,IOCP:(忙= 0,免费= 1000,最小= 1000,最大= 1000),工作人员:(忙= 430,免费= 32337,最小= 315,最大= 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

此解决方案可能会帮助您: Are you seeing a high number of busyio or busyworker threads in the timeout exception?

帖子结尾处显示:

在.Net Core中,添加环境变量 COMPlus_ThreadPool_ForceMinWorkerThreads覆盖默认值 MinThreads设置,根据环境/注册表配置 旋钮-您也可以使用与ThreadPool.SetMinThreads()方法相同的方法 如上所述。

,

下面是我随笔附上我所问问题的文字。我希望这可以帮助某人并节省很多时间。

首先,我们没有任何例外/错误/报告,带宽是Azure基础结构的瓶颈。这只是我们的假设。但是,为了反驳这一假设,我们增加了很多容量,甚至MS Azure团队都说我们的配置超出了使用范围。 因此带宽从来都不是问题。 它的局限性:

  1. StackExchangeRedis Nuget软件包,尤其是当它处理更多内容时 数据字节。

  2. 分析称我们称很多不必要的事情 端点或我们不需要该页面的数据。

因此,作为我的POV,我们需要对如何使用StackExchangeRedis包来处理最少且仅必要的数据以及如何减少对FE等不必要端点的调用进行优化。

我的队友一直与开发StachExchangeRedis的人保持联系。开发人员承认,巨大的数据块具有局限性。他还告诉我们,我们不是唯一遇到此问题的人。

因此,在所有讨论之后,我们优化了对GET / SET操作的调用。它使我们能够以更加精确和有效的方式处理数据字节,以实现必要的终结点,从而切断所有不需要的终结点和调用。我们还在后端实现了某种压缩。

最后,我们添加了其他区域,使我们可以改善当前状况。

尽管如此,我们正在考虑跳过用法Redis,转而使用NoSQL解决方案。我们将立即解决几个问题-缓存问题和实时数据+大数据的SQL限制(到目前为止,这仅是一个想法)

P.S。影响Redis性能的因素

  • 在许多实际场景中,Redis吞吐量受网络的限制要早于CPU的限制。要在单个服务器上整合多个高吞吐量Redis实例,值得考虑放置一个10 Gbit / s NIC或多个具有TCP / IP绑定的1 GBit / s NIC。
  • CPU是另一个非常重要的因素。作为单线程,Redis 偏爱具有大量高速缓存且内核不多的快速CPU。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...