2

我们已经开始在我们的应用程序中使用 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 响应会阻止其他请求完成。我认为是因为入站流量值很高。这是对的吗?可以用它做什么?我是否需要以某种方式分隔请求?

4

1 回答 1

0

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

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

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

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

于 2018-12-03T20:29:03.917 回答