什麼會導致 Memcached 掛起 2 秒以上?
我要瘋了,試圖擴展 memcached。從他們的網站:
Memcached 操作幾乎都是 O(1)。連接到它並發出 get 或 stat 命令永遠不會滯後。如果連接滯後,您可能會達到最大連接數限制。有關要監視的統計資訊的詳細資訊,請參閱 ServerMaint。
如果發出命令滯後,您可能會遇到許多調整問題。最常見的是硬體問題、RAM 不足(交換)、網路問題(頻寬、丟包、半雙工連接)。在極少數情況下,作業系統錯誤或 memcached 錯誤可能會造成影響。
嗯.. 對我來說,它肯定不像 O(1) 操作那樣執行。在我們網站的低負載到正常負載下,獲取和設置操作的 memcached 響應時間約為 0.001 秒。不錯。但是,如果我們將負載增加三倍,我們會得到需要 100 倍(或在極少數情況下為 1000 倍!)的異常值。我什至有一個實例,memcached 儲存一個值需要 2.2442 秒。
顯然,這正在扼殺我們的網站。
這是 Memcached->getStats 在慢速時期之一的輸出:
[pid] => 18079 [uptime] => 8903 [threads] => 4 [time] => 1332795759 [pointer_size] => 32 [rusage_user_seconds] => 26 [rusage_user_microseconds] => 503872 [rusage_system_seconds] => 125 [rusage_system_microseconds] => 477008 [curr_items] => 42099 [total_items] => 422500 [limit_maxbytes] => 943718400 [curr_connections] => 84 [total_connections] => 4946 [connection_structures] => 178 [bytes] => 7259957 [cmd_get] => 1679091 [cmd_set] => 351809 [get_hits] => 1662048 [get_misses] => 17043 [evictions] => 0 [bytes_read] => 109388476 [bytes_written] => 3187646458 [version] => 1.4.13
所以到目前為止我排除的事情是:
- 達到最大連接數限制(
curr_connections
84 遠低於預設的最大值 1024)- 交換 - 機器在 1024M 記憶體中有 900M 專用於專用機器上的 memcached。根據統計數據,它似乎只使用了大約 7MB 的數據
bytes
。我將如何診斷其他硬體問題?prstat 在 CPU 或記憶體使用方面並沒有真正顯示出很多情況。不知道如何找出網路問題,但由於這是與網路盒在同一專用網路上的專用伺服器,我認為這不是連接問題(
ping
盒子之間的時間不到一毫秒)。還有什麼我在這裡想念的嗎?它快把我逼瘋了。
編輯:還忘了提到我已經嘗試了持久和非持久連接,影響最小甚至沒有。
如果 Memcached 使用交換記憶體,它的性能會顯著下降。如果您注意到伺服器上正在使用交換記憶體,您可以嘗試使用該
-k
選項啟動 memcached。來自:http ://code.google.com/p/memcached/wiki/NewHardware#Avoid_Swapping
避免交換
將物理記憶體(額外增加百分之幾)分配給 memcached 伺服器。不要過度分配記憶體並期望交換可以節省您的時間。性能會非常非常差。如果您的伺服器正在使用交換,請特別注意監控,並在必要時進行調整。
我將作業系統從 SmartOS 更改為 Ubuntu,問題似乎得到了解決。不知道為什麼,但這似乎是 memcached 和作業系統之間的問題。