StackExchange.Redis TIMEOUT 增长的未发送队列

StackExchange.Redis TIMEOUT growing unsent queue

我们上周末的测试环境看到许多 VM 开始记录超时,其中未发送队列一直在增长:

Timeout performing GET 0:B:ac64ebd0-3640-4b7b-a108-7fd36f294640, inst: 0, mgr: ExecuteSelect, queue: 35199, qu: 35199, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, IOCP: (Busy=2,Free=398,Min=4,Max=400), WORKER: (Busy=5,Free=395,Min=4,Max=400)

Timeout performing SETEX 0:B:pfed2b3f5-fbbf-4ed5-9a58-f1bd888f01, inst: 0, mgr: ExecuteSelect, queue: 35193, qu: 35193, qs: 0, qc: 0, wr: 0, wq: 0, in: 0, ar: 0, IOCP: (Busy=2,Free=398,Min=4,Max=400), WORKER: (Busy=6,Free=394,Min=4,Max=400)

我已经阅读了很多关于分析这些的帖子,但大多数时候它不涉及未发送消息队列的增长。在此期间没有记录连接错误; AppPool 回收解决了这个问题。有没有其他人以前见过这个问题?

一些可能相关的额外信息:

  1. 在 StackExchange.Redis nuget 包
  2. 的 1.0.450 和 1.0.481 版本上看到相同的超时
  3. ASP.Net v4.5 Web API 1.x 受影响的网站
  4. 升级到 Redis 3.0.4(从 3.0.3)同一周遇到错误(但几天前)
  5. 安装了 New Relic .NET APM v5.5.52.0,其中包括一些 StackExchange.Redis 工具 (https://docs.newrelic.com/docs/release-notes/agent-release-notes/net-release-notes/net-agent-55520),同样是在超时前几天。为了以防万一,我们已将其回滚。

我遇到了同样的问题。

为了研究问题,我们每 10 秒记录一次 ConnectionMultiplexer 的 ConnectionCounters 以进行监控。

它只显示增长的 pendingUnsentItems,这意味着 StackExchange.Redis 不会 send/receive 来自套接字。

completedAsynchronously completedSynchronously  pendingUnsentItems  responsesAwaitingAsyncCompletion    sentItemsAwaitingResponse
1   10  4   0   0
1   10  28  0   0
1   10  36  0   0
1   10  51  0   0
1   10  65  0   0
1   10  72  0   0
1   10  85  0   0
1   10  104 0   0
1   10  126 0   0
1   10  149 0   0
1   10  169 0   0
1   10  190 0   0
1   10  207 0   0
1   10  230 0   0
1   10  277 0   0
1   10  296 0   0
...snip
1   10  19270   0   0
1   10  19281   0   0
1   10  19291   0   0
1   10  19302   0   0
1   10  19313   0   0

我猜套接字编写器线程已停止?

我的环境是

  • StackExchange.Redis 1.0.481
  • Windows 服务器 2012 R2
  • .NET Framework 4.5
  • ASP.NETMVC 5.2.3
  • 已安装 New Relic .NET APM v5.7.17.0

看起来这个问题是在版本 5.5-5.7 之间使用 New Relic .NET APM 时发现的,并在 5.8 中得到修复。