Redis请求延迟

时间:2013-01-24 09:28:27

标签: php redis

我正在使用带有php-fpm和phpredis驱动程序的redis(2.6.8),并且遇到了redis延迟问题。在某些负载下,首先从我们的应用程序请求redis需要大约1-1.5秒,redis-cli --latency显示相同的延迟。

我已经检查了the latency guide

  • 我们在使用Unix套接字的同一主机上使用redis
  • slowlog没有条目更长5ms
  • 我们不使用AOF
  • redis需要大约3.5Gb的16Gb内存(我想这不算太多)
  • 我们的系统没有交换
  • 没有其他进程正在执行磁盘I / O

我正在使用持久连接,连接客户端的数量从5到25不等(有时会达到60-80)。

Here is the graph

当有20个或更多同时连接的客户端时,问题似乎就开始了。

你能帮我弄清楚问题出在哪里吗?

更新

我调查了这个问题,看起来redis由于某种原因没有足够的处理器时间来正常运行。

我在网络嗅探器的帮助下彻底检查了php-fpm和redis之间的通信。 Redis收到了关于tcp的请求,但仅在一秒半后才发回答案。它显然表明问题出在redis内部,它无法在给定条件下处理如此多的请求(可能处理器不足,因为处理器只占整个系统的50%)。

通过将redis移动到几乎空闲的其他服务器来解决问题。我想我们应该使用linux调度程序使它在同一台服务器上运行,但还没有完成。

2 个答案:

答案 0 :(得分:1)

请记住Redis是单线程的。如果您正在执行的操作在处理器密集型方面出错,则您的请求可能会相互阻塞。例如,如果你正在对具有非常大值的哈希进行HVALS,那么当你提取所有数据并将其复制到输出缓冲区时,你将使所有客户端等待。

您需要在此处执行的部分操作(无论是否存在此问题)是查看您正在使用的所有命令并确定每个命令的复杂性。如果你正在针对非常大量的数据执行大量O(N)命令,那么你一次只做太多的事情并非不可能。

TL; DR此处的任何人都可以在不知道您正在使用哪些命令以及您的数据是什么样的情况下确定地调试此问题。但是你可以查看你正在使用的每种方法的时间复杂度,并确保它是合理的。

答案 1 :(得分:0)

我在研究我正在研究的问题时遇到了这个问题,但认为这可能对此有所帮助:

https://groups.google.com/forum/#!topic/redis-db/uZaXHZUl0NA

如果您通读了该主题,则会有一些有趣的信息。