什么原因会导致 Memcached 挂起 2 秒以上?

什么原因会导致 Memcached 挂起 2 秒以上?

我快要疯了,想扩展 memcached。摘自他们的网站:

Memcached 操作几乎全部都是 O(1)。连接到它并发出 get 或 stat 命令绝不会延迟。如果连接延迟,则可能是您已达到最大连接数限制。有关要监视的统计数据的详细信息,请参阅 ServerMaint。

如果发出命令时出现延迟,则可能会出现许多调整问题。最常见的是硬件问题、RAM 不足(交换)、网络问题(带宽、丢包、半双工连接)。极少数情况下,操作系统错误或 memcached 错误也可能导致此问题。

嗯……对我来说,它的性能肯定不像 O(1) 操作。在我们网站的低到正常负载下,memcached 的 get 和 set 操作响应时间约为 0.001 秒。还不错。但如果我们将负载增加三倍,就会出现异常值,其时间会是这个时间的 100 倍(在极少数情况下是 1000 倍!)。我甚至遇到过一个情况,memcached 存储一个值需要 2.2442 秒。

显然这会毁掉我们的网站。

以下是 Memcached->getStats 在某个缓慢时期的输出:

        [pid] => 18079
        [uptime] => 8903
        [threads] => 4
        [time] => 1332795759
        [pointer_size] => 32
        [rusage_user_seconds] => 26
        [rusage_user_microseconds] => 503872
        [rusage_system_seconds] => 125
        [rusage_system_microseconds] => 477008
        [curr_items] => 42099
        [total_items] => 422500
        [limit_maxbytes] => 943718400
        [curr_connections] => 84
        [total_connections] => 4946
        [connection_structures] => 178
        [bytes] => 7259957
        [cmd_get] => 1679091
        [cmd_set] => 351809
        [get_hits] => 1662048
        [get_misses] => 17043
        [evictions] => 0
        [bytes_read] => 109388476
        [bytes_written] => 3187646458
        [version] => 1.4.13

到目前为止我排除的事情是:

  • 达到最大连接数限制(curr_connections84 远低于默认的最大连接数 1024)
  • 交换 - 该机器有 1024M 内存中的 900M 专门用于 memcached。根据统计数据,它似乎只使用了大约 7MB 的数据bytes

我该如何诊断其他硬件问题?prstat 并没有真正显示 CPU 或内存使用情况。不确定如何找出网络问题,但由于这是与 Web 盒位于同一私有网络上的专用服务器,因此我认为这不是连接问题(两个ping盒子之间的时间差不到一毫秒)。

我还遗漏了什么吗?这让我很抓狂。

编辑:还忘了提及我已经尝试了持久和非持久连接,影响极小甚至没有。

答案1

如果使用交换内存,Memcached 的性能会显著下降。如果您注意到服务器上正在使用交换内存,您可以尝试使用该-k选项启动 memcached。

从:http://code.google.com/p/memcached/wiki/NewHardware#Avoid_Swapping

避免交换

为 memcached 服务器分配物理内存,并额外分配百分之几。不要分配过多内存,并期望交换空间可以帮你节省内存。性能会非常非常差。请格外小心地监控你的服务器是否正在使用交换空间,并在必要时进行调整。

答案2

我将操作系统从 SmartOS 更改为 Ubuntu,问题似乎已解决。不知道原因,但似乎是 memcached 和操作系统之间的问题。

答案3

问题最终是,调用机器耗尽了所有 CPU,导致其 TCP 连接严重滞后。水平扩展 Web 层解决了这个问题。结果发现,这根本不是 memcached 的问题——这只是另一个问题的症状出现的地方。

答案4

还要确保您确实拥有像您认为的那样有效的持久连接。(嗨,这是我 6 年前的原始问题……仍然❤️你……)

相关内容