首先让我说这是该主题的后续问题。
通过将 memcached 服务器从 Solaris (SmartOS) 切换到 Ubuntu,这个问题得到了“解决”。现在我们已经将负载增加了大约 5 倍并且再次遇到问题。
我们正在运行一个站点,该站点每分钟处理大约 1000 个请求,每个请求命中 Memcached 大约有 3 次读取和 1 次写入。所以负载大约是每秒 65 个请求。缓存中的数据总量约为 37M,每个键包含的数据量非常小(一个 JSON 编码的整数数组,总计不到 1K)。
我们在这些页面上设置了基准测试脚本,并将数据输入 StatsD 进行日志记录。问题是 Memcached 需要很长时间才能响应的峰值。这些似乎与流量高峰无关。
是什么导致了这些尖峰?为什么 memcached 会花一秒钟的时间来回复?我们刚刚启动了第二台服务器以放入池中,它并没有对峰值的频率或严重性产生任何明显的影响。
这是服务器上 getStats() 的输出:
Array
(
[-----------] => Array
(
[pid] => 1364
[uptime] => 3715684
[threads] => 4
[time] => 1336596719
[pointer_size] => 64
[rusage_user_seconds] => 7924
[rusage_user_microseconds] => 170000
[rusage_system_seconds] => 187214
[rusage_system_microseconds] => 190000
[curr_items] => 12578
[total_items] => 53516300
[limit_maxbytes] => 943718400
[curr_connections] => 14
[total_connections] => 72550117
[connection_structures] => 165
[bytes] => 2616068
[cmd_get] => 450388258
[cmd_set] => 53493365
[get_hits] => 450388258
[get_misses] => 2244297
[evictions] => 0
[bytes_read] => 2138744916
[bytes_written] => 745275216
[version] => 1.4.2
)
[-----------:11211] => Array
(
[pid] => 8099
[uptime] => 4687
[threads] => 4
[time] => 1336596719
[pointer_size] => 64
[rusage_user_seconds] => 7
[rusage_user_microseconds] => 170000
[rusage_system_seconds] => 290
[rusage_system_microseconds] => 990000
[curr_items] => 2384
[total_items] => 225964
[limit_maxbytes] => 943718400
[curr_connections] => 7
[total_connections] => 588097
[connection_structures] => 91
[bytes] => 562641
[cmd_get] => 1012562
[cmd_set] => 225778
[get_hits] => 1012562
[get_misses] => 125161
[evictions] => 0
[bytes_read] => 91270698
[bytes_written] => 350071516
[version] => 1.4.2
)
)
编辑:这是 10,000 个值的集合和检索结果。
普通的:
Stored 10000 values in 5.6118 seconds.
Average: 0.0006
High: 0.1958
Low: 0.0003
Fetched 10000 values in 5.1215 seconds.
Average: 0.0005
High: 0.0141
Low: 0.0003
扣球时:
Stored 10000 values in 16.5074 seconds.
Average: 0.0017
High: 0.9288
Low: 0.0003
Fetched 10000 values in 19.8771 seconds.
Average: 0.0020
High: 0.9478
Low: 0.0003
网络堆栈可能有问题。我遇到了与 memcached 类似的问题,原因是 linux conntrack 处理程序用完了。您能否检查峰值前后的 netstat -s -t 输出以检查 tcp 错误和重新传输。您还可以尝试使用 wireshark 查看流量转储以获取有关该问题的更多信息。
除了检查您的网络统计数据之外,是否可以升级到具有性能改进的版本 1.4.10(或更高版本)?从1.4.10 发行说明开始:
虽然我们的服务器无法获得您的流量,但在我们的案例中,升级到 1.4.10 有帮助,启用压缩(我们的值大于 1MB)和二进制协议也有帮助。有关详细信息,请参阅我在Drupal SE上的回答。
问题原来是调用机器耗尽了所有可用的 CPU。这导致了奇怪的问题的发生,并且看起来 memcached 是问题所在,但实际上并非如此。那只是更大问题的一个症状。
水平扩展 Web 层解决了这个问题。
如果您使用的是 Joyent,查看正在使用的 CPU 上限的有用命令是
jinf -c