Ubuntu

Memcached 滯後

  • June 18, 2012

讓我先說這是本主題的後續問題。

通過將 memcached 伺服器從 Solaris (SmartOS) 切換到 Ubuntu 來“解決”這個問題。現在我們已經將負載增加了大約 5 倍,但又遇到了問題。

我們正在執行一個每分鐘大約 1000 個請求的站點,每個請求以大約 3 次讀取和 1 次寫入命中 Memcached。所以負載大約是每秒 65 個請求。記憶體中的總數據約為 37M,每個 key 包含的數據量非常小(一個 JSON 編碼的整數數組,總大小不到 1K)。

我們在這些頁面上設置了一個基準測試腳本,並將數據輸入 StatsD 進行記錄。問題是 Memcached 需要很長時間才能響應的尖峰。這些似乎與流量高峰無關。

StatsD 的執行時間

什麼可能導致這些尖峰?為什麼 memcached 需要一秒鐘才能回复?我們剛剛啟動了第二台伺服器以放入池中,它在峰值的頻率或嚴重性方面沒有任何明顯差異。

這是伺服器上 getStats() 的輸出:

Array
(
   [-----------] => Array
       (
           [pid] => 1364
           [uptime] => 3715684
           [threads] => 4
           [time] => 1336596719
           [pointer_size] => 64
           [rusage_user_seconds] => 7924
           [rusage_user_microseconds] => 170000
           [rusage_system_seconds] => 187214
           [rusage_system_microseconds] => 190000
           [curr_items] => 12578
           [total_items] => 53516300
           [limit_maxbytes] => 943718400
           [curr_connections] => 14
           [total_connections] => 72550117
           [connection_structures] => 165
           [bytes] => 2616068
           [cmd_get] => 450388258
           [cmd_set] => 53493365
           [get_hits] => 450388258
           [get_misses] => 2244297
           [evictions] => 0
           [bytes_read] => 2138744916
           [bytes_written] => 745275216
           [version] => 1.4.2
       )

   [-----------:11211] => Array
       (
           [pid] => 8099
           [uptime] => 4687
           [threads] => 4
           [time] => 1336596719
           [pointer_size] => 64
           [rusage_user_seconds] => 7
           [rusage_user_microseconds] => 170000
           [rusage_system_seconds] => 290
           [rusage_system_microseconds] => 990000
           [curr_items] => 2384
           [total_items] => 225964
           [limit_maxbytes] => 943718400
           [curr_connections] => 7
           [total_connections] => 588097
           [connection_structures] => 91
           [bytes] => 562641
           [cmd_get] => 1012562
           [cmd_set] => 225778
           [get_hits] => 1012562
           [get_misses] => 125161
           [evictions] => 0
           [bytes_read] => 91270698
           [bytes_written] => 350071516
           [version] => 1.4.2
       )

)

編輯:這是一組和檢索 10,000 個值的結果。

普通的:

Stored 10000 values in 5.6118 seconds.
Average: 0.0006
High: 0.1958
Low: 0.0003

Fetched 10000 values in 5.1215 seconds.
Average: 0.0005
High: 0.0141
Low: 0.0003

扣球時:

Stored 10000 values in 16.5074 seconds.
Average: 0.0017
High: 0.9288
Low: 0.0003

Fetched 10000 values in 19.8771 seconds.
Average: 0.0020
High: 0.9478
Low: 0.0003

網路堆棧可能有問題。我遇到了與 memcached 類似的問題,原因是 linux conntrack 處理程序用完了。您能否檢查尖峰前後的 netstat -s -t 輸出以檢查 tcp 錯誤和重新傳輸。您還可以嘗試使用 wireshark 查看流量轉儲以獲取有關該問題的更多資訊。

除了檢查您的網路統計數據之外,是否可以升級到具有性能改進的版本 1.4.10(或更高版本)?從1.4.10 發行說明

此版本的重點是執行緒可伸縮性和性能改進。在撰寫本文時,此版本應該能夠比任何網卡支持的更快地回饋數據。

雖然我們的伺服器無法獲得您的流量,但在我們的案例中,升級到 1.4.10 會有所幫助,啟用壓縮(我們的值大於 1MB)和二進制協議也有幫助。有關詳細資訊,請參閱我在Drupal SE上的回答。

引用自:https://serverfault.com/questions/387644