StackExchange.Redis.RedisTimeoutException:等待响应的超时

时间:2019-08-26 16:38:17

标签: c# asp.net redis threadpool stackexchange.redis

我有一个Redis集群,其中包含6个实例,3个主实例和3个从属实例。我的ASP .NET Core应用程序将其用作缓存。有时我会收到这样的错误:

StackExchange.Redis.RedisTimeoutException: Timeout awaiting response (outbound=0KiB, inbound=5KiB, 5504ms elapsed, timeout is 5000ms), command=GET, next: GET CRM.UsersMainService.GetUserInfoAsync.vvs1@domain.org, inst: 0, qu: 0, qs: 6, aw: False, rs: DequeueResult, ws: Idle, in: 0, in-pipe: 5831, out-pipe: 0, serverEndpoint: 5.178.85.30:7002, mgr: 9 of 10 available, clientName: f0b7b81f5ce5, PerfCounterHelperkeyHashSlot: 9236, IOCP: (Busy=0,Free=1000,Min=2,Max=1000), WORKER: (Busy=10,Free=32757,Min=2,Max=32767), v: 2.0.601.3402 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts) (Most recent call last)

如果需要更多信息,只需问我,我会尽力提供。预先感谢。

1 个答案:

答案 0 :(得分:1)

从您的异常消息中可以看到,对于您的流量,您的最小工作进程数太低。

  

工作者:(忙碌= 10,免费= 32757,最小值= 2,最大值= 32767)

发生此异常时,您有10个繁忙的工作线程,而您有2个启动工作线程。

当您的应用程序用尽可用线程来完成一项操作时,.NET会启动一个新线程(当然,直到最大值)。并稍等一下,是否需要其他工作线程。如果您的应用程序仍需要工作线程,则.NET将启动另一个工作线程。然后另一个,然后另一个...但这需要时间。它不会在0毫秒内发生。通过查看您的异常消息,我们可以看到.NET创建了另外8个工作线程(10-2 = 8)。在创建过程中,此特定的Redis操作已等待并最终超时。

您可以在应用程序的开头使用ThreadPool.SetMinThreads(Int32, Int32)方法来设置最小线程数。我建议您从ThreadPool.SetMinThreads(10, 10)开始,并在测试时对其进行调整。

其他阅读内容:

https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.setminthreads https://stackexchange.github.io/StackExchange.Redis/Timeouts.html

相关问题