php - Redis 请求延迟

标签 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 scheduler 让它在同一台服务器上工作,但还没有这样做。

最佳答案

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

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

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

关于php - Redis 请求延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14497907/

相关文章:

javascript - 使用两个提交按钮提交两个 jQuery ajax 表单

ruby-on-rails - Redis 寻找 env redis url 变量不确定将 env 变量放在哪里 坏 URI(不是 URI?):(URI::InvalidURIError)

android - 在 Kivy Mobile 应用程序中使用 Redis?

c# - 如何使用 ServiceStack CacheClient 和 Redis 来递增或创建计数器

php - 在一页或所有页面上写 session 开始?

php - SQL 查询,我需要得到一些值

php - magic-quotes 是 ON && 一起使用 stripslashes 和 mysql-real-escape-string

php - Symfony Dom Crawler 在模板中缺少结束标记

python - Redis:获取所有哈希值的最佳方式

windows - Windows 的 "official"Redis 端口是哪个?