從運維的角度理解 memcached
《使用Memcached實現抽獎活動》 從應用的角度講了講memcached,這篇文章從運維的角色說一說,換個角度思考能夠更好的使用memcached。
1:啟動
memcached 在啟動的時候有很多的引數,列舉幾個重要的。
-m:memcached 可以使用的記憶體,注意 memcached 實際佔用的記憶體大於 -m 配置的值,比如網路連線也要佔用記憶體。
-d:後臺執行memcached。
-v:控制 STDOUT/STDERR 的輸出,多個 -v 可以輸出很多有用的資料,比如檢視set了那些key,對於排查問題非常有用。
-l:服務繫結的網絡卡地址,繫結內網網絡卡可以有效保證安全性。
-p:修改 tcp 監聽埠,對應的 udp 埠也修改。
-U:是否支援 udp 埠,預設是關閉的。
-u:以某個使用者的身份啟動 memcached,避免使用 root 啟動,有效保障安全性。
-s:限制只有本地 user 通過 unix domain socket 訪問。
-c:設定最大連線數,預設是 1024,如果當前最大連線數超過 -c 設定的值,請求在連線佇列中等待,由於 memcached 連線佔用的資源非常少,所以該值不要設定太高。
-t:工作執行緒數量,預設是 4,可以有效利用多核伺服器,由於 memcached 效能很高,該值不建議設定過高。
2:硬體選擇
從硬體角度調優系統引數。
(1)cpu or 記憶體
memcached 是多執行緒模型,效能極高,所以不一定要多核伺服器,但記憶體越大越好。
那麼選擇什麼樣的伺服器來放置 memcached 呢?如果規模較小,那麼在 web 伺服器上部署 memcached 是非常不錯的選擇,memcached cpu 消耗很小 ,不會加重 web 伺服器的負載,而 web 伺服器對記憶體的要求不高,剩下來的記憶體可以供 memcached 使用。
需要注意的是,不要在專用的資料庫伺服器上部署 memcached,因為這兩個服務對記憶體的要求都非常高,避免發生 swap。
對於具有一定規模的業務來說,採用專門的伺服器來部署 memcached 更有優勢,它們都具有大容量的記憶體,需要注意的是,一個節點可以部署很多個例項,如果某個節點掛掉了,那麼失效的 key 會非常多,這在容量規劃的時候要注意。
(2)網絡卡
網路流量取決於memcached請求峰值和item平均大小,避免跑滿頻寬,不過現在的網絡卡都是千兆了,理論上應該不會出現問題。
(3)網路連線數
首先要注意的是,-c 啟動的連線數不要太高,一方面避免超過系統允許的連線數;另外一方面memcached非常高效,沒有必要設定太高,-c 最優化配置和作業系統本身的TCP優化很有關係。
memcached使用專門的一個執行緒接收客戶端連線,如果客戶端頻繁的連線、釋放,這個執行緒的壓力會非常大,可以使用長連線或memcached udp 監聽來避免連線和釋放的消耗。
3:分析和監控
memcached 協議命令有兩種型別,add/set/get主要用於完成工作,而其他一些內部命令對於排查、優化、分析都非常有幫助,比如:
-
stats:常規統計 ,列出的資訊非常多。
-
stats slabs:slab 統計 ,返回大小和記憶體使用情況,也包含每個 slab class的統計資訊。
-
stats item:item 統計 ,返回每個slab class 的item資訊,相比 stats slabs 命令,stats items 顯示更高層次的資訊。
-
stats sizes:item 大小統計 ,返回不同大小item儲存的個數。
瞭解這四個基本命令後,我們看看監控怎麼弄,當然也可以看看官方提的一個工具:
https://github.com/memcached/memcached/blob/master/scripts/memcached-tool)。
並不是為了使用它,而是看看它關注什麼,從中可以學到很多。
提醒:memcached 1.4版本以後,內部命令和記憶體管理髮生了很大的變化,大家如果使用了一些外部統計和監控工具,需要看看這些工具有沒有更新。
(1)應用監控,定時執行 set、get 等命令,監控操作是否成功,以及記錄響應的效能。如果連線很慢,可能是網路問題,如果效能低下,可能產生了記憶體 swap。
(2)stats
curr_connections:檢視某個埠的連線數,避免 curr_connections 大於配置的最大連線數(-c)。
listen_disabled_num:這個值最好接近於 0,如果大於0,表示有多個連線進入了連線佇列,需要等待其他連線的釋放。
accepting_conns:這個數值和 listen_disabled_num 很類似,如果服務連線數已達到最大值,該值被設定為 1。
limit_maxbytes:該值等於服務啟動配置的記憶體總容量(-m),即有多少記憶體可以使用。
cmd_flush:該數值表示有多少個 flush 命令被執行了,如果數值過大,說明應用的模式有問題,從監控的角度看,應該儘量避免。
(3)檢視 evicted
可以使用 stats 和 stats items 命令監控 evicted 和 evicted_nonzero 數量,前者針對整體,後者針對各個 slab。
evicted 表示被剔除的數量,evicted_nonzero 更重要,值如果過高表示沒有過期的 item 被 evicted 的太多了,這可能會影響業務。
注意:evicted 過高,不一定代表記憶體不夠。比如 set 了大量 keys,但這些 keys 後來從沒使用過,也會導致 evicted 過高。
(4)檢視命中率
通過 stats 命令可以統計全域性的命中率:get_hits / (get_hits + get_misses,瞭解某個時間點命中率,以及命中率變化的情況。
stats slabs 命令能夠了解每個 slab 的統計情況,但沒有 get_misses 數值,但可以通過觀察 get_hits 和 cmd_set 間接瞭解每個 slab 命中率的變化。
注意:命中率不高,不一定代表記憶體不夠,比如請求的 keys 大量不存在,也會導致命中率過低。
(5)系統監控
比如系統負載,cpu 使用率、swap 情況、網絡卡流量等等。