【问题标题】:Redis request latencyRedis 请求延迟
【发布时间】:2013-01-08 00:08:54
【问题描述】:

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

我已经检查过the latency guide

  • 我们在具有 Unix 套接字的同一主机上使用 redis
  • slowlog 不再有条目 5 毫秒
  • 我们不使用 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-cli info 我只能看到每秒的瞬时操作
  • 试试这个解决方案:stackoverflow.com/questions/14076403/…
  • 我使用的是 Unix 套接字而不是 TCP/IP
  • 您是否更改了后台进程的赫兹设置?也许给它更多的 CPU 时间会有所帮助。

标签: php redis


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我已经看过这个主题了,因为我是主题的发起者 :) 谢谢,无论如何
    • 你想让我把我的帖子撤下来还是留下?
    • 我认为你绝对应该离开它。您帖子中的链接可能对其他人有用。
    猜你喜欢
    • 2014-12-04
    • 1970-01-01
    • 2021-01-08
    • 2013-11-17
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多