Redis 请求延迟

2022-08-30 22:29:38

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

我已经检查了延迟指南

  • 我们在具有Unix套接字的同一主机上使用redis。
  • 慢日志没有条目,长度为 5ms
  • 我们不使用AOF
  • redis需要大约3.5Gb的16Gb内存(我想它不是太多)
  • 我们的系统未交换
  • 没有其他进程执行磁盘 I/O

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

这是图表

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

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

更新

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

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

通过将 redis 移动到其他几乎空闲的服务器,问题已得到解决。我想我们应该玩Linux调度程序,让它在同一台服务器上工作,但还没有这样做。


答案 1

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

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

TL;DR 这里没有人可以真正确定地调试这个问题,而无需知道您正在使用哪些命令以及您的数据是什么样子的。但是,您可以查找您正在使用的每种方法的时间复杂度,并确保它是合理的。


答案 2

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

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

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


推荐