Redis的出队率比网络慢了10倍

时间:2017-10-26 15:43:11

标签: redis

我正在通过具有1Gbps LAN速度的网络测试入队和出队的redis率,两台机器都有1Gbps以太网卡。 Redis版本:3.2.11

使用python客户端lpush 1L项目每个项目1个字节。 使用rpop使项目出现在网络上花了大约55秒,这只是1800 dequeues sec。虽然相同的操作在5秒内完成,但我从本地出发,大约20,000次出列秒。

入队率几乎接近出列率。

这是使用办公室网络完成的,当时没有多少用途。在生产环境中也观察到相同的情况!

接受网络上不到3倍的下降。大约10倍看起来我做错了。

请建议我是否需要在服务器或客户端进行任何配置更改。

先谢谢。

2 个答案:

答案 0 :(得分:1)

在其他人发现此问题时回溯答复。

往返延迟和并发可能是您的瓶颈。如果所有出队调用都是串行的,那么您正在堆积该网络延迟。如果以2毫秒的延迟进行100万次呼叫,那么您将至少有200万毫秒的延迟开销(或33分钟)。这意味着您的应用程序正在等待服务器接收有效负载,执行某些操作并回复以确认操作成功。一些redis客户端还会执行多个呼叫以使单个作业入队/出队(pop&ack / del),从而有可能使该数字加倍。

以下链接说明了不同库使用redis密钥的不同方法(ruby的resque与clojure的胭脂红,请注意使用在redis服务器上针对单个消息执行的多个redis命令)。这可能是您期望的10倍和3倍性能的原因。

https://kirshatrov.com/2018/07/20/redis-job-queue/

每个msg出队两个调用的过于简化的示例(等待时间为1毫秒,redis服务器操作需要1毫秒):

    |client                    | server
~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1ms | pop msg      >--(1ms)-->  receive pop request
2ms |                           [process request (1ms)]
3ms | receive msg  <--(1ms)--<  send msg to client
4ms | send del     >--(1ms)-->  receive del
5ms |                           [delete msg from queue (1ms)]
6ms | receive ack  <--(1ms)--<  reply with delete ack

提高出队时间通常涉及使用支持多线程或多进程并发的客户端(即10个并发工作器会大大减少完成工作的总时间)。这样可以通过发送出队请求流来确保更好地利用网络,而不用等待一个请求完成才抓取下一个请求。

对于1字节还是500字节,默认的TCP MTU是1500字节。减去TCP报头,有效负载约为1460字节(如果使用GRE / IPsec进行隧道传输,则减少;如果使用巨型帧,则增加)。由于两种有效载荷大小都适合单个TCP数据包,因此它们具有相似的性能特征。

1gbps的以太网接口每秒可以传输81,274到1,488,096个数据包(取决于有效负载大小)。

实际上,这是一个问题,您可以在客户端上同时运行多少个进程和线程以使网络和Redis服务器保持繁忙。

答案 1 :(得分:0)

Redis通常是I / O绑定,而不是CPU绑定。它可能会达到网络带宽限制。鉴于消息的小小,大部分带宽可能会被TCP开销占用。

在本地计算机上,您受内存带宽的限制,这比1Gbps网络带宽快得多。您可以通过增加一次抓取的数据量来提高网络吞吐量。