Redis——QPS、响应时间、连接数、响应大小和网络连接速度的相关性

Redis - correlation between QPS, response time, number of connections, response size and network connection speed

作为我之前问题的后续,How does Redis achieve the high throughput and performance?

我有以下问题

我见过 Redis 的实际应用,对其容量印象深刻和敬畏。想要更多地了解这个魔法。我已经看到,当 Redis 框和查询框更近时,即使在高 QPS (1kps) 下,响应时间也只有 5 毫秒。当它们在地理上更远时(相同的数据中心与不同的数据中心),响应时间会上升到 50 毫秒。这仅仅是网络延迟,还是 Redis 必须维持一些开销,直到整个数据被刷新。

连接数会影响Redis的吞吐量吗?想象一下,Redis 能够在 500 微秒内响应每个请求。想象一下,在一个给定的实例中,1000 个不同的客户端连接及时发出了 1000 个不同的请求。最后一个请求是否需要 500muSec * 1000 = 500ms?

响应大小对这里有影响吗?想象一下每个响应的大小约为 100 KB,Redis 上的 TCP 连接必须等到最后一个数据包被传送,如果网络连接速度很慢,它会减慢 Redis 的速度吗?

这是我的答案:

想进一步了解这个魔法。

Redis 牛逼,但没有魔力。它只是非常务实的概念的一种聪明而有效的实施。而且因为它是一个人类规模的项目,实际上很容易理解为什么,看一下源代码。

这仅仅是网络延迟,还是 Redis 必须维持一些开销,直到整个数据被刷新。

当然,Redis 必须维护通信缓冲区,以便它可以处理较慢的网络链接。也就是说,这对感知延迟的影响应该很小。在您的情况下,50 毫秒可能主要是由于网络延迟,您可以通过 运行 ping 命令或任何其他类似工具进行检查。

连接数会影响Redis的吞吐量吗?

当然可以,就像任何服务器软件一样。现在,您需要区分每个连接的吞吐量和服务器的全局吞吐量。

每个连接的吞吐量受连接数的影响很大。考虑到服务器只能提供一定的带宽,并且这个带宽是跨连接共享的。连接越多,每个连接的带宽越少。

另一方面,服务器的全局吞吐量受连接数的影响很小。 Redis 可以毫无问题地接受数万个连接。但是仍然有开销。根据经验,考虑在 30000 个连接时,Redis 仅支持在 100 个连接时可支持的吞吐量的一半。查看 Redis benchmark page.

上可用的精美图表

最后一个请求是否需要 500muSec * 1000 = 500ms?

是的,但你的数字可能有误。

是的,所有activity都是序列化的(单线程设计),所以还要加上每个命令的处理时间。当同时收到许多命令时,最后一个将在所有其他命令之后执行。如果每个命令需要 5 微秒处理,并且同时收到 1000 个,则最后一个回复将在 5 毫秒内发送。

现在,实际上,真正的并发查询数并没有那么高。 Redis 很少在同一事件循环迭代中同时接收 1000 个查询。

此外,您混淆了 response 时间(在客户端测量)和 processing 时间(即在 Redis 端测量)。 response 时间可以是 500 us,但是 processing 时间更接近 5 us,不同之处在于在网络上花费的时间和在OS 进程调度。请记住,只有 processing 时间必须累积,其他所有内容都通过连接并行处理(例如网络延迟)。

要计算实例的平均 processing 时间,只需使用 redis-benchmark 使实例饱和。使用流水线时,实例处理多达 400 Kop/s 或更多的情况并不少见,平均 处理 时间为 2.5 us。

响应大小对这里有影响吗?

当然可以,就像任何服务器软件一样。超过一定大小后,延迟总是受到数据量的影响,因为带宽和网络速度都是有限的。对于以太网网络,此阈值与 MTU 的大小密切相关。

Redis 上的 TCP 连接必须等到最后一个数据包被传递,如果网络连接速度慢,是否会降低 Redis 的速度?

绝对不是。由于事件循环,Redis 系统地缓冲回复(无论其大小),并以非阻塞方式管理所有套接字。如果一个连接很慢(或者一个客户端很慢),Redis 会尽可能多地填充相应的套接字缓冲区,在事件循环中注册套接字,然后移动到另一个连接。当套接字缓冲区中再次出现 space 时,事件循环将继续在慢速连接上发送流量。什么都不会阻塞。