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

Gop*_*pal 4 redis

作为我之前的问题的后续跟进,Redis如何实现高吞吐量和高性能?

我有以下问题

我已经看到Redis在行动,并对其能力印象深刻.想要更多地了解这种魔力.我已经看到,当Redis盒和查询盒更接近时,即使在高QPS(1kps)时,响应时间也是5ms.当它们在地理上更远时(数据中心与不同的数据中心相同),响应时间可达50毫秒.这只是网络延迟还是Redis必须保持一些开销,直到整个数据被刷新.

连接数可以影响Redis吞吐量吗?想象一下,Redis能够以500微秒的速度响应每个请求.并且假设1000个不同的客户端连接在给定实例上有1000个不同的请求.最后一个请求是否需要500muSec*1000 = 500ms?

响应大小可以在这里产生影响吗?想象一下,每个响应的大小为100 KB,Redis上的TCP连接必须等到最后一个数据包交付,如果网络连接速度慢,它会减慢Redis吗?

Did*_*zia 6

以下是我的答案:

想要更多地了解这种魔力.

Redis真棒,但没有魔法.它只是一个非常务实的概念的智能和有效的实现.而且因为它是一个人性化的项目,通过查看源代码实际上很容易理解为什么.

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

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

连接数可以影响Redis吞吐量吗?

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

每个连接的吞吐量受连接数的严重影响.考虑服务器只能提供一定的带宽,并且这些带宽在连接之间共享.连接越多,每个连接的带宽就越少.

另一方面,服务器的全局吞吐量仅受连接数的轻微影响.Redis可以接受成千上万的连接,没有任何问题.但仍然存在开销.根据经验,考虑到在30000个连接处,Redis仅支持100个连接可支持的吞吐量的一半.请参阅Redis基准页面上提供的漂亮图表.

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

是的,但你的数字可能是错的.

是的,所有活动都是序列化的(单线程设计),因此必须添加每个命令的处理时间.当同时接收到许多命令时,最后一个命令将在所有其他命令之后被提供.如果每个命令需要5我们应该在处理,和1000在同一时间收到,最后的答复将在5毫秒发送.

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

此外,您会混淆响应时间(在客户端测量)和处理时间(将在Redis端测量).的响应时间可以是500我们,但处理时间是多少我们更接近5,区别在于所花费的网络上,并在OS进程调度的时间.请记住,只需要累计处理时间,其他所有内容都通过连接进行并行化(例如网络延迟).

要计算实例的平均处理时间,只需使用redis-benchmark来使实例饱和.使用流水线时,看到处理速度高达400 Kop/s或更高的情况并不罕见,平均处理时间为2.5 us.

响应大小可以在这里产生影响吗?

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

Redis上的TCP连接必须等到最后一个数据包交付,如果网络连接速度慢,它会减慢Redis吗?

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