我有一臺memcached實例在機器上運行,以承擔數據庫的壓力。 目前通過PHP每秒約有350個請求,根據memcached文檔,這應該是完全可行的,但我看到get()時間太慢。平均約60 ms,兩種方式都有尖峯(0.1 ms和250 ms)。Memcached慢得到,CPU使用率高
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錯了嗎?或者還有其他事情正在發生?
編輯:
根據要求,這裏是用得到的代碼(沒有太多的話):
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");
編輯2: 出於某種原因,我仍然注意到數據庫上的高負載。現在,當我通過telnet手動檢查要存在於緩存中的數據時,它就好了。難道memcached客戶端認爲與緩存的連接超時並因此進入數據庫?這將讓我的問題爲什麼地球上的連接超時...
我們可以看看你正在執行'get'命令的代碼嗎? – Pudge601
@ Pudge601完成! – lordstyx
你應該考慮升級你的1.4.5版本的memcache,你是一個相當老的版本。 http://memcached.org/ –