首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >托管在Microsoft中的.NET核心API应用程序超时异常(Redis,.NET,.NET Core)

托管在Microsoft中的.NET核心API应用程序超时异常(Redis,.NET,.NET Core)
EN

Stack Overflow用户
提问于 2020-09-25 11:45:31
回答 2查看 1.5K关注 0票数 1

我有以下基础设施:.NET Core3.1API,它托管在VNet中。在VNet内部,我们有8台具有负载均衡器+ Server + Redis缓存的服务器。

我们在登录操作(不是轻量级操作)上每秒运行API负载测试1200操作。此时,所有服务器的负载为5-10%。但问题是我们得到了API超时和Redis超时问题。

好像有东西挡住了我们的线

这是来自我的Startup.cs (我们试图发挥价值,但没有成功):

代码语言:javascript
复制
  var threadCount = 2000; 
  ThreadPool.GetMaxThreads(out _, out var completionThreads); 
  ThreadPool.SetMinThreads(threadCount, completionThreads);

这是来自*.csproj文件的:

代码语言:javascript
复制
 <PropertyGroup>
<ThreadPoolMinThreads>315</ThreadPoolMinThreads>

添加了Update1-> Redis发布信息

更正错误: StackExchange.Redis.RedisTimeoutException:超时等待响应(outbound=0KiB,inbound=0KiB,经过10008ms,超时为10000 rs),command=GET,下一步: SET key_digievents____freeevent_4072,inst: 0,qs: 684,aw: False,rs: ReadAsync,ws: Idle,in: 2197285,in-管道: 0,serverEndpoint: 10.0.0.34:6379,mc: 1/1/0,mgr: 10 %可用,clientName: akssocial27apiapp-xkkb4,IOCP:(Busy=0,Free=1000,Min=1000,Max=1000),工作人员:(Busy=430,Free=32337,Min=315,Max=32767),v: 2.1.58.34321 StackExchange.Redis.RedisTimeoutException:超时等待响应(outbound=0KiB,inbound=0KiB,经过10008ms,超时为10000 mc),command=GET,next: SET key_digievents____freeevent_4072,inst: 0,qs: 0,qs: 684,aw: False,rs: ReadAsync,ws:空闲,in: 2197285,in-管道: 0,out-管道: 0,serverEndpoint: 10.0.0.34:6379,mc: 1/1/0,mgr: 10 %,Datadog.Trace.ClrProfiler.Integrations.StackExchange.Redis.ConnectionMultiplexer.ExecuteAsyncImplInternalT clientName: akssocial27apiapp-xkkb4 4,IOCP:(Busy=0,Free=1000,Min=1000,Max=1000),WORKER:(Busy=430,Free=32337,Min=315,Max=32767),v: 2.1.58.34321

如果有任何建议,我会很高兴的。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-10-06 19:07:40

以下是随函附上我所提问题的说明。我希望这能帮到别人,节省很多时间。

首先,我们没有异常/错误/报告说带宽是Azure基础设施的瓶颈。这只是我们的假设。但是为了反驳这种假设,我们增加了大量的容量,就连Azure女士的团队也在说,我们的供应过剩,而不是我们的使用。所以带宽从来都不是问题。它的限制是:

  1. StackExchangeRedis Nuget包,特别是当它处理更多的数据字节时。
  2. 分析称,对于页面不需要的页面,我们会调用大量不必要的端点或数据。

因此,作为我的POV,我们需要弄清楚如何使用StackExchangeRedis包来处理最小且只需要的数据,以及如何减少对FE上不需要的端点的调用等等。

我的队友已经和开发StachExchangeRedis的人取得了联系。开发人员承认,对于巨大的数据块,它有其局限性。他还告诉我们,我们并不是唯一经历这一问题的人。

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

最后,我们增加了更多的区域,使我们能够改善目前的局势。

不过,我们正在考虑跳过Redis的使用,转而使用NoSQL解决方案。我们将同时解决几个问题-缓存问题和对大数据的实时数据+ SQL限制(到目前为止,这只是一个想法的层次)。

P.S.影响Redis绩效的因素

  • 在许多现实世界中,Redis吞吐量在受到CPU限制之前就受到网络的限制。要在一台服务器上合并多个高吞吐量Redis实例,值得考虑使用10 Gbit/s NIC或多个1 GBit/s NIC与TCP/IP连接。
  • CPU是另一个非常重要的因素。作为单线程的,Redis倾向于具有大缓存和不多核心的快速CPU。
票数 1
EN

Stack Overflow用户

发布于 2020-09-25 14:57:42

很多人升级到2.x时都会遇到TimeoutException

https://github.com/StackExchange/StackExchange.Redis/issues/1226

此解决方案可能对您有所帮助:在超时异常中,您是否看到了大量的busyio或busyworker线程?

在帖子的末尾,写着:

在.Net核心中,根据环境/注册表配置旋钮,添加环境变量COMPlus_ThreadPool_ForceMinWorkerThreads来覆盖默认的MinThreads设置--您还可以使用上面描述的相同的ThreadPool.SetMinThreads()方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64063509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档