4

我在机器上运行了一个 memcached 实例来承受数据库的压力。目前通过 PHP 每秒大约有 350 个请求,根据 memcached 文档,这应该是完全可行的,但我看到 get() 时间慢得离谱。平均大约 60 毫秒,两种方式都有尖峰(0.1 毫秒和 250 毫秒)。

memcached 进程也一直使用大约 80% 的 CPU。它变得非常有问题,因为所有组合都需要超过 5 秒才能完成页面。

我很确定这是我在代码中注释掉的 get 命令,数据库接管,使 memcached 进程使用 0 CPU。

以下是统计数据:

stats
STAT pid 617
STAT uptime 855901
STAT time 1370358572
STAT version 1.4.5
STAT pointer_size 32
STAT rusage_user 15472.778988
STAT rusage_system 38712.971409
STAT curr_connections 175
STAT total_connections 4423163
STAT connection_structures 252
STAT cmd_get 319670822
STAT cmd_set 48996864
STAT cmd_flush 0
STAT get_hits 233440856
STAT get_misses 86229966
STAT delete_misses 11025386
STAT delete_hits 11131141
STAT incr_misses 27702934
STAT incr_hits 19471007
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 25484001864
STAT bytes_written 77617943971
STAT limit_maxbytes 201326592
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 47135355
STAT curr_items 539471
STAT total_items 21293860
STAT evictions 3183365
STAT reclaimed 3222011
END

和设置:

stats settings
STAT maxbytes 201326592
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter 127.0.0.1
STAT verbosity 0
STAT oldest 0
STAT evictions on
STAT domain_socket NULL
STAT umask 700
STAT growth_factor 1.25
STAT chunk_size 48
STAT num_threads 4
STAT stat_key_prefix :
STAT detail_enabled no
STAT reqs_per_event 20
STAT cas_enabled yes
STAT tcp_backlog 1024
STAT binding_protocol auto-negotiate
STAT auth_enabled_sasl no
STAT item_size_max 1048576
END

现在我配置 memcached 错了吗?还是有其他事情发生?

编辑:

根据要求,这是带有 get 的代码(没有太多内容):

function getItem($memcached, $key, $id) {
    $md5key = md5($key.":".$id);
    $v = $memcached->get($md5key); // changing this to $v = false made the memcached CPU usage go to 0
    if ($v === false) {
        //code that fetches the correct data for each key, stores it in memcached and in $v.
    }
    return $v;
}

在主脚本中有以下内容:

$memcached = new Memcached;
$memcached->addServer('localhost', 11211) or die ("Could not connect to memcached server");
$memcached->setOption(Memcached::OPT_COMPRESSION, false);

$myItem = getItem($memcached, "key", "123");

EDIT2:出于某种原因,我仍然注意到数据库的负载很高。现在,当我通过 telnet 手动检查缓存中是否存在数据时,一切正常。会不会是 memcached 客户端认为与缓存的连接超时并因此访问了数据库?那会给我留下一个问题,为什么连接在地球上超时......

4

1 回答 1

1

嗯,我发现了问题!为了了解每秒的请求数,我使用了可用的 memcache.php 文件。它告诉我每秒有 350 个请求。问题是过去几天的使用量增加了很多,每秒请求数实际上只是整个正常运行时间的平均值。按(命中+未命中)/正常运行时间计算。现在重新启动 memcached 后,这个平均值会返回更正确的值,实际上每秒有 4000 个请求。

tl; dr:第一篇文章中的统计数据错误。正确的统计数据是:4000 个请求/秒。

我想我的硬件根本无法应付。

于 2013-06-06T18:59:01.937 回答