1. 首页>
  2. 技术文章>
  3. StackExchange.Redis Timeout performing 超时问题

StackExchange.Redis Timeout performing 超时问题

9/21/22 3:16:42 PM 浏览 1566 评论 0

StackExchange.Redis

最近在做的一个项目,用的.net core 2.1,然后缓存用的Redis,缓存相关封装是同事写的,用的驱动是StackExchange.Redis version 2.0.571 ,一直听说这个驱动并发情况下有TimeOut bug,项目开发差不多后,我压测了一下,简单的模拟30个用户持续访问某一个有用到缓存的查询接口,结果这么小的压力下超时异常出现:

Timeout performing GET my_141 (5000ms), inst: 30, qu: 0, qs: 20, in: 20320, serverEndpoint: 172.16.3.119:6379, mgr: 10 of 10 available, clientName: s-119, IOCP: (Busy=0,Free=1000,Min=1,Max=1000), WORKER: (Busy=120,Free=32747,Min=1,Max=32767), v: 2.0.571.20511(Please take a look at this article for some common client-side issues that can cause timeouts:  https://stackexchange.github.io/StackExchange.Redis/Timeouts))

原因简析

StackExchange.Redis维护了一个专有线程池,但是在线程数超过5,且并发数超过10(每个任务处理的非常慢的极端情况)就会使用.Net 全局线程池。StackExchange.Redis无法配置这个工作线程数。当并发过多,且全局线程池的Minimum 很小时,就会出现超时TimeOut 的情况。所以下面可以解决这个问题:

System.Threading.ThreadPool.SetMinThreads(200, 200);


网友讨论