我快要疯了,想扩展 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_connections
84 远低于默认的最大连接数 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 年前的原始问题……仍然❤️你……)