【问题标题】:Timeouts and slow requests to Redis when using StackExchange.Redis library使用 StackExchange.Redis 库时对 Redis 的超时和缓慢请求
【发布时间】:2019-05-05 04:30:04
【问题描述】:

我们已经开始在我们的应用程序中使用 Redis 来在那里持久化 API 响应。我选择使用 StackExchange.Redis 来处理它,在实现了保存响应的整个逻辑之后,压力测试的结果变得非常令人失望。应用程序的总吞吐量下降了 3-4 倍!大约是 550-600rps,现在大约是 180rps(甚至可能更慢)。

有时在压力测试过程中根本没有异常,但有时会发生超时异常,如下所示:

Timeout awaiting response (5094ms elapsed, timeout is 5000ms), inst: 0, qs: 10, in: 65536, mgr: 10 of 10 available, IOCP: (Busy=26,Free=974,Min=8,Max=1000), WORKER: (Busy=3,Free=32764,Min=8,Max=32767), v: 2.0.513.63329 
Timeout awaiting response (5063ms elapsed, timeout is 5000ms), inst: 0, qs: 4, in: 47355, mgr: 10 of 10 available, IOCP: (Busy=40,Free=960,Min=8,Max=1000), WORKER: (Busy=34,Free=32733,Min=8,Max=32767), v: 2.0.513.63329 
The timeout was reached before the message could be written to the output buffer, and it was not sent (5000ms, inst=3, qs=3, in=10, active=HMSET), inst: 3, qs: 3, in: 10, mgr: 10 of 10 available, IOCP: (Busy=36,Free=964,Min=8,Max=1000), WORKER: (Busy=34,Free=32733,Min=8,Max=32767), v: 2.0.513.63329 

这是上次压力测试期间发生的所有超时异常的总体概览图:

我尝试实现连接池(基于 TotalOutstanding 属性),尝试减少对 Redis 的请求数量等等,但这并没有帮助。

我执行了 SHOW LOG 和 LATENCY DOCTOR 命令,但我们的 Redis 实例似乎一切正常(尽管我们按照医生的建议禁用了 THP)。

我的假设是一些非常大的 API 响应会阻止其他请求完成。我认为是因为入站流量值很高。这是正确的吗?可以用它做什么?我需要以某种方式分隔请求吗?

【问题讨论】:

  • 我们将 IOCP 缓冲区从 8 增加到 300。ThreadPool.SetMinThreads(minimumThreadCount, minimumThreadCount);我们还有一个 ConnectionMultiplexor 池和最多 100 个之间的循环调用。

标签: c# asp.net-core redis timeout stackexchange.redis


【解决方案1】:

我在这里看到了一个有趣的提示:

The timeout was reached before the message could be written to the output buffer

我认为,基本上,Redis 是在告诉您清除传入的消息,因为它向您firehosing数据。您可能已经创建了一个范围相当广泛的订阅。

我经历了同样的经历,最后只是将数据推送到订阅 lambda 上的内存缓存(又名ConcurrentQueue<T>)中,并在一个单独的、受限制的线程中处理消息结果,该线程将检查队列并处理内容,典型的生产者-消费者-队列方法。超时错误此时消失了。

【讨论】:

  • 我在迁移到 Redis 之前使用过 IMemoryCache。我们有一个服务器集群,当一个服务器从负载平衡中移除时,应用程序应该能够获得 API 响应。我不使用 Redis 提出的订阅机制。只有 async-await 调用来获取和放置数据。
  • 另外,除了从套接字接收消息之外,我看不到任何其他方法可以清除传入消息。
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
相关资源
最近更新 更多