StackExchange.Redis高输入缓冲区in:65536偶发超时问题排查求助
问题判断准确性
你的判断是准确的,报错中in: 65536确实指向客户端TCP socket的输入缓冲区有64KB数据未被StackExchange.Redis的IO线程读取/处理,不属于服务端慢查询、工作线程不足的常见问题范畴。
同类问题常见诱因
- 你使用的StackExchange.Redis v2.2.4版本存在已知的IO读取死锁bug,在高并发下偶发出现读取线程阻塞,导致缓冲区数据积压触发批量超时
- ASP.NET工作进程的TCP接收缓冲区默认配置过小,当存在大值key(比如单个缓存值超过32KB)批量返回时,缓冲区被占满后触发TCP零窗口通知,服务端停止发送数据,最终超时
- 4个工作进程共用同一个ConnectionMultiplexer实例的配置错误,导致连接复用冲突,IO调度阻塞
可行解决方案
- 首先升级StackExchange.Redis到v2.6.112以上版本,该版本修复了多个IO读取线程阻塞的已知问题,是目前生产环境验证最稳定的版本
- 调整ConnectionMultiplexer初始化参数,增加
socketReceiveBufferSize配置到1MB,同时设置asyncTimeout和syncTimeout统一为10000ms - 确保每个ASP.NET工作进程单独初始化一个ConnectionMultiplexer单例,不要跨进程复用连接实例
- 排查是否存在单key超过10KB的大缓存对象,对超过大小的对象做拆分压缩处理,避免单次返回数据量过大阻塞读取
内容的提问来源于stack exchange,提问作者Eric Butler
相关产品推荐
相关产品推荐

