Php Redis请求延迟

Php Redis请求延迟,php,redis,Php,Redis,我将redis(2.6.8)与php fpm和phpredis驱动程序一起使用,在redis延迟问题上遇到了一些问题。在特定负载下,应用程序向redis发出的第一个请求大约需要1-1.5秒,redis cli--latency显示相同的延迟 我已经查过了 我们在具有Unix套接字的同一主机上使用redis slowlog不再具有5ms的条目 我们不使用AOF redis需要大约3.5Gb的16Gb可用内存(我想不会太多) 我们的系统没有交换 没有其他进程执行磁盘I/O 我使用的是持久连接,连

我将redis(2.6.8)与php fpm和phpredis驱动程序一起使用,在redis延迟问题上遇到了一些问题。在特定负载下,应用程序向redis发出的第一个请求大约需要1-1.5秒,
redis cli--latency
显示相同的延迟

我已经查过了

  • 我们在具有Unix套接字的同一主机上使用redis
  • slowlog不再具有5ms的条目
  • 我们不使用AOF
  • redis需要大约3.5Gb的16Gb可用内存(我想不会太多)
  • 我们的系统没有交换
  • 没有其他进程执行磁盘I/O
我使用的是持久连接,连接的客户端数量从5到25个不等(有时是60到80个)

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

你能帮我找出问题出在哪里吗

更新 我调查了这个问题,发现redis似乎因为某种原因没有足够的处理器时间来正常运行

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


通过将redis移动到另一台几乎处于空闲状态的服务器,问题得以解决。我想我们应该使用linux scheduler使其在同一台服务器上工作,但还没有这样做。

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


如果您通读该线程,会发现一些有趣的信息。

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

这里需要做的部分工作(不管这是否是问题)是查看您正在使用的所有命令,并确定每个命令的复杂性。如果您正在对大量数据执行一组
O(N)
命令,那么一次执行太多的任务并非不可能


TL;DR这里没有人能够在不知道您正在使用的命令和数据外观的情况下真正确定地调试这个问题。但是,您可以查看所使用的每种方法的时间复杂度,并确保其合理。

吞吐量和平均有效负载是多少?我如何衡量它?使用
redis cli info
每秒只能看到即时操作。请尝试此解决方案:我使用的是Unix套接字而不是TCP/IP。您是否更改了后台进程的赫兹设置?也许给它更多的cpu时间会有所帮助。我已经看到了这个主题,因为我是主题的发起者:)Thx,不管怎样,你想让我把我的帖子拿下来还是离开它?我想你绝对应该离开它。你文章中的链接可能对其他人有用。