データベースの負荷を軽減するために、マシン上で memcached インスタンスを実行しています。現在、PHP 経由で 1 秒あたり約 350 のリクエストがあり、memcached のドキュメントによると完全に実行できるはずですが、get() 時間が途方もなく遅いことがわかります。平均すると約 60 ミリ秒で、両方向にスパイクがあります (0.1 ミリ秒と 250 ミリ秒)。
memcached プロセスも、常に約 80% の CPU を使用しています。すべての get を組み合わせると、ページが完了するまでに 5 秒以上かかるため、非常に問題になっています。
コードでコメントアウトし、データベースが引き継ぎ、memcached プロセスが 0 CPU を使用するようにしたため、get コマンドであると確信しています。
統計は次のとおりです。
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 クライアントは、キャッシュへの接続がタイムアウトしていると判断し、データベースにアクセスした可能性がありますか? それは、一体なぜ接続がタイムアウトしているのかという疑問を私に残します...