2013-06-04 52 views
4

我有一臺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客戶端認爲與緩存的連接超時並因此進入數據庫?這將讓我的問題爲什麼地球上的連接超時...

+0

我們可以看看你正在執行'get'命令的代碼嗎? – Pudge601

+0

@ Pudge601完成! – lordstyx

+0

你應該考慮升級你的1.4.5版本的memcache,你是一個相當老的版本。 http://memcached.org/ –

回答

1

嗯,我發現了問題! 爲了瞭解每秒的請求,我使用了可用的memcache.php文件。它告訴我每秒有350個請求。問題在於,過去幾天使用量有所增加,而且每秒的請求數只是整個正常運行時間的平均值。按(點擊+錯過)/正常運行時間計算。 現在重新啓動memcached後,這個平均值會返回更正確的值,實際上每秒鐘有4000個請求。

tl; dr:第一篇文章中的錯誤統計。正確的統計數據是:4000個請求/秒。

我想我的硬件根本無法應付這種情況。

+0

4000 /秒是很多。可伸縮的memcaches可能會有幫助。 :) –

+0

@AaronJiang:是的,這也許是我如何將我的東西存儲在緩存中的重新考慮。目前每次加載網頁時,我都需要大約100個緩存,每個緩存只返回<200字節的數據。 – lordstyx