2011-07-21 103 views
9

我在我的服務器上運行memcached,當它達到600+請求/秒時,它變得不穩定並導致大量問題。當請求率變得很高時,隨機時間我的PHP應用程序無法連接到memcache服務器,導致緩慢的加載時間,這使得nginx和php-fpm嚇壞了,並且我收到了一堆104:同級連接重置我的nginx日誌中有錯誤。600多個memcache請求/問題 - 幫助!

我想指出,在我的memcache服務器中,我有'熱對象' - 有時會收到90%的memcache請求的對象。我還注意到,如果有很多請求碰到單個對象,它會稍稍增加一點點加載時間給整個頁面(當它設法加載時)。

我將不勝感激這個問題的任何幫助。非常感謝!

+1

聽起來像是你應該穿上serverfault問題啓用它。 – Matt

回答

7

開關遠離使用TCP套接字,並打算Unix套接字(假設你是一個基於UNIX的服務器上)

開始用插座memcached的啓用: 添加-s /tmp/memcached.socket到您的memcached的啓動命令行(注意,插座禁用網絡支持)

然後在PHP中,連接使用永久連接,並以新的內存緩存插座:

$memcache_obj = new Memcache; 
$memcache_obj->pconnect('unix:///tmp/memcached.socket', 0); 

另一項建議是,如果你有多個緩存對象的「類型」,爲每個「類型」啓動一個memcached實例,並在其中分配熱門項目。

Drupal這樣做,你可以看到他們的配置文件和memcached init是如何設置的here

另外,這聽起來像你的memcached超時設置方式爲高。如果超過1秒或2秒,可以鎖定腳本。應該達到超時,腳本應該默認通過另一種方法(SQL,文件等)檢索對象

另一件事是驗證您的memcache沒有被放入交換文件,如果您的緩存小於你的平均免費內存,試着用-k選項啓動memcache,這將迫使它的緩存始終保持內存並且不能被交換。

如果你有一個多核服務器,也確保Memcached是編譯線程支持,並使用-t <numcores>

+0

由於某些原因,當我使用套接字,服務器運行良好幾分鐘,然後極其緩慢。不知道爲什麼... – Aco

1

對於memcached,每秒600個請求數極低。

如果您正在爲每個請求建立連接,那麼您需要花費更多時間來連接,而不是快速請求和刻錄臨時端口,這可能是您遇到的問題。

+1

你有什麼建議? – Aco

+1

我不太清楚你在做什麼,足以說明任何事情。您似乎正在爲每個請求建立連接。如果你是,那麼我建議不要這樣做,因爲上述原因。 – Dustin

0

有幾件事情你可以嘗試:

  • 如果您memcached的本地運行,則可以使用名爲socket「本地主機」,而不是「127.0.0.1」
  • 使用persisntent連接
+0

我不希望強制使用解析器來減少問題。 – Dustin

+0

使用127.0.0.1實際上會打開一個套接字,而localhost是本地主機套接字的別名(因此不會打開一個新套接字)。 –

+1

Linux不會這樣做。 PHP有一個特定的MySQL驅動程序。雖然這是一個相當糟糕的設計決定。如果有人想要一個unix域套接字而不是TCP/IP套接字,那麼他們應該問他們想要什麼。 – Dustin