StackExchange.Redis.RedisTimeoutException:等待响应超时
Posted
技术标签:
【中文标题】StackExchange.Redis.RedisTimeoutException:等待响应超时【英文标题】:StackExchange.Redis.RedisTimeoutException: Timeout awaiting response 【发布时间】:2019-12-30 20:59:43 【问题描述】:我有一个包含 6 个实例、3 个主实例和 3 个从属实例的 Redis 集群。我的 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)
【问题讨论】:
你看过错误提示中推荐的文章了吗? stackexchange.github.io/StackExchange.Redis/Timeouts @howcheng 是的,我尝试按照那里的描述进行操作,但没有帮助 无论何时发生,运行SLOWLOG GET 10
以查看可能导致它的慢查询。
这可能是在黑暗中拍摄,但我遇到了类似的问题,因为 Redis 无法同时处理大量并发请求。
你想做什么操作?如果它的 get 或 set 推送/存储的数据的大小是多少,并提到正在使用的数据结构,如 String、HashTable 或 SET?
【参考方案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
【讨论】:
这对我有用,但还不够,我们还要扩展我们的应用程序。谢谢你的回答!以上是关于StackExchange.Redis.RedisTimeoutException:等待响应超时的主要内容,如果未能解决你的问题,请参考以下文章