2012-03-29 59 views
1

我們正在使用PHP,並且正在使用memcached v1.4.6進行緩存。我們正在使用來自PECL的memcache擴展memcache-2.2.6。我們使用持久連接來連接到memcached。隨着密鑰數量的增加,PHP memcache返回false

最近我們做了一些改變,使存儲在memcached中的鍵的數量增加了一倍。這些按鍵的最大長度爲75到80個字符。存儲的值是整數。

每當我們嘗試使用新代碼時,系統在前幾秒(通常少於10秒)內都能正常工作。在開始的幾秒鐘之後,memcache開始爲每個請求返回「false」(獲取,設置,增量)

如果在此階段我們恢復到舊代碼,事情再次開始正常工作。

我們的memcached服務器上的請求速率是每秒約270個請求(使用舊代碼)。預計這個新代碼每秒會增加超過1000個請求。

當memcache開始返回「false」時,大約15%的分配內存空閒。

什麼可能導致此行爲?

+0

是做什麼用的命令啓動memcached服務器?也許這是一個最大的內存問題,你說它什麼時候開始重複虛假,只有15%的內存是空閒的,是整個操作系統內存,還是僅僅爲memcached分配的內存? – capi 2012-03-29 15:25:41

+0

我們使用以下命令啓動memcached服務器:'/ usr/bin/memcached -d -m 2048 -u root'。當它開始返回「false」時,分配給memcached的內存的15%是空閒的。如果我錯了,請糾正我,但即使在沒有空閒內存的情況下,當我們發出'set'命令時,memcached也不應該逐出舊的項目。在這種情況下,對「set」的響應不應該是「false」。謝謝。 – Nikhil 2012-03-30 03:15:10

+0

嘗試使用munin或phpmemcachedadmin查看驅逐率(非常容易安裝,請在我的帖子下面鏈接)。可能會提供更多關於memcached內部進行的信息。您也可以深入到平板並查看存儲的項目及其值。作爲最後的手段,嘗試使用Memcached庫,它有更多的運行時選項,代碼類似,如果你已經有了一個包裝器,可能不會有如此大的改變。 – capi 2012-03-30 11:11:43

回答

1

看起來可能是壓縮或序列化問題。我會建議做更多的調試來查看確切的服務器響應。首先,嘗試做一個telnet和手動設置和獲取鍵:

telnet a.b.c.d 11211 
SET key_name 0 300 3 
123 
STORED 
GET a 
VALUE a 0 3 
123 
END 

參見:

http://code.google.com/p/memcached/wiki/NewCommandshttp://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

的協議命令。

如果一切順利,你可以嘗試在服務器上的監視器看到正在執行的命令:

telnet a.b.c.d 11211 
STATS detail on 
//wait a while 
STATS detail off 
STATS detail dump 
//list of commands will be dumped 

您可以通過它的運行時配置php.ini調整的庫位:

http://www.php.net/manual/en/memcache.ini.php

也許你可以查看PHP的Memcached(注意D)庫作爲替代。

而且,一個良好的監測工具:

http://code.google.com/p/phpmemcacheadmin/

+0

感謝@capi的迴應。我可以使用telnet接口在memcache中設置'''get'鍵。 'STATS詳細轉儲'顯示了很少的命令(19),前綴是我附加到鍵上的。 PHP日誌在同一時間內顯示幾千條命令。 – Nikhil 2012-03-29 09:42:05