• StackExchange.Redis .net core Timeout performing 超时问题


    最近在做的一个项目,用的.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))

    后面是堆栈信息.....

    1553699729031

    蛋疼了很久,搜了很多文章,得到以下

    解决方案

    1、换掉,不用这个驱动( 可以看看.net core redis 驱动推荐,为什么不使用 StackExchange.Redis

    2、redis操作修改为全部异步&& ThreadPool.SetMinThreads(200, 200);

    我用的第二种解决了问题,主要换驱动也可能遇到坑;还有时间成本问题;

    原因简析

    我们看到以上的异常信息当中有这么一段:

    IOCP: (Busy=0,Free=1000,Min=1,Max=1000),

    WORKER: (Busy=120,Free=32747,Min=1,Max=32767),

    意思是当前繁忙的WORKER 线程有120个,而系统“要由线程池根据需要创建的新的最小工作程序线程数。”,也就是系统创建的工作线程数不足以满足redis的Get操作的繁忙线程的需求,导致部分Get操作的线程堵塞超时了;

    所以我们把“最小线程workerThreads” 修改为200解决问题;

    200是我估摸着生产环境服务器设置的,该值设置不合理有可能导致性能问题;

  • 相关阅读:
    开始研究web,mark一下
    干掉Unity3D
    mysql NDB
    mysql federated engine
    mysql memory
    mysql merge
    mysql innodb 引擎
    mysql myisam
    mysql 的日志文件
    mysql 的数据文件
  • 原文地址:https://www.cnblogs.com/xiaxiaolu/p/10612049.html
Copyright © 2020-2023  润新知