我有一個包含 6 個實例的 Redis 集群,3 個主實例和 3 個從實例。我的 ASP .NET Core 應用程序使用它作為緩存。有時我會收到這樣的錯誤:StackExchange.Redis.RedisTimeoutException: Timeout awaiting response (outbound=0KiB, inbound=5KiB, 5504ms elapsed, timeout is 5000ms), command=GET, next: GET [email protected], 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 回答

九州編程
TA貢獻1785條經驗 獲得超4個贊
正如我從您的異常消息中看到的,您的最小工作進程數對于您擁有的流量來說太低了。
工人:(忙=10,空閑=32757,最小=2,最大=32767)
當這個異常發生時,你有 10 個繁忙的工作線程,而你有 2 個工作線程需要啟動。
當您的應用程序用完可用線程來完成一項操作時,.NET 會啟動一個新線程(當然,直到達到最大值)。并稍等一下,看看是否需要額外的工作線程。如果您的應用程序仍然需要工作線程,則 .NET 會啟動另一個工作線程。然后另一個,然后另一個……但這需要時間。它不會在 0 毫秒內發生。通過查看異常消息,我們可以看到 .NET 創建了 8 個額外的工作線程 (10 - 2 = 8)。在創建過程中,這個特定的 Redis 操作一直在等待并最終超時。
ThreadPool.SetMinThreads(Int32, Int32)
您可以在應用程序開頭使用方法來設置最小線程數。ThreadPool.SetMinThreads(10, 10)
我建議您在測試時開始并進行調整。
- 1 回答
- 0 關注
- 182 瀏覽
添加回答
舉報
0/150
提交
取消