内存缓存滞后

Bra*_*yer 6 ubuntu php scalability memcached memcache

让我先说这是本主题的后续问题。

通过将 memcached 服务器从 Solaris (SmartOS) 切换到 Ubuntu 来“解决”这个问题。现在我们已经将负载增加了大约 5 倍,并且再次遇到问题。

我们正在运行一个大约每分钟处理 1000 个请求的站点,每个请求以大约 3 次读取和 1 次写入命中 Memcached。所以负载大约是每秒 65 个请求。缓存中的数据总量约为 37M,每个键包含的数据量非常小(JSON 编码的整数数组,小于 1K)。

我们在这些页面上设置了一个基准测试脚本,并将数据输入 StatsD 进行记录。问题在于,Memcached 需要很长时间才能响应的峰值。这些似乎与流量高峰无关。

来自 StatsD 的执行时间

什么可能导致这些尖峰?为什么 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
        )

)
Run Code Online (Sandbox Code Playgroud)

编辑:这是一组和检索 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
Run Code Online (Sandbox Code Playgroud)

尖峰时:

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
Run Code Online (Sandbox Code Playgroud)

Bra*_*yer 0

事实证明,问题是调用计算机耗尽了所有可用的 CPU。这导致奇怪的问题发生,看起来 memcached 是问题所在,但事实上并非如此。这只是更大问题的一个症状。

水平扩展网络层解决了这个问题。

如果您使用的是 Joyent,查看您正在使用多少 CPU 上限的有用命令是jinf -c