最近在作的一个项目,用的.net core 2.1,而后缓存用的Redis,缓存相关封装是同事写的,用的驱动是StackExchange.Redis
version 2.0.571
,一直据说这个驱动并发状况下有TimeOut bug,项目开发差很少后,我压测了一下,简单的模拟30个用户持续访问某一个有用到缓存的查询接口,结果这么小的压力下超时异常出现:html
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))git
后面是堆栈信息.....github
蛋疼了好久,搜了不少文章,获得如下redis
一、换掉,不用这个驱动( 能够看看.net core redis 驱动推荐,为何不使用 StackExchange.Redis)api
二、redis操做修改成所有异步&& ThreadPool.SetMinThreads(200, 200);缓存
我用的第二种解决了问题,主要换驱动也可能遇到坑;还有时间成本问题;服务器
咱们看到以上的异常信息当中有这么一段:并发
IOCP: (Busy=0,Free=1000,Min=1,Max=1000),异步
WORKER: (Busy=120,Free=32747,Min=1,Max=32767),ide
意思是当前繁忙的WORKER 线程有120个,而系统“要由线程池根据须要建立的新的最小工做程序线程数。”,也就是系统建立的工做线程数不足以知足redis的Get操做的繁忙线程的需求,致使部分Get操做的线程堵塞超时了;
因此咱们把“最小线程workerThreads” 修改成200解决问题;
200是我估摸着生产环境服务器设置的,该值设置不合理有可能致使性能问题;