特點:
1、基于C/S架構,協定簡單(基于文本協定);
2、基于libevent的事件處理;
(libevent是一套跨平台的事件處理接口的封裝,能夠相容包括這些作業系統:
Windows/Linux/BSD/Solaris 等作業系統的的事件處理。poll、select(Windows)、epoll(Linux)、kqueue(BSD)、/dev/pool(Solaris) Memcached 使用libevent來進行網絡并發連接配接的處理,能夠保持在很大并發情況下,仍舊能夠保持快速的響應能力。)
3、自主記憶體存儲處理;
<a href="http://blog.51cto.com/attachment/201309/215347760.png"></a>
Slab 存儲結構:
<a href="http://blog.51cto.com/attachment/201309/215553238.png"></a>
存儲方式:
Slab是一次申請記憶體的最小機關,每個slab都是1MB
Slab Allocation;避免大量重複的初始化和清理—減輕記憶體管理器負擔
避免頻繁malloc/free –避免造成過多的碎片
過期方式:Lazy Expiration + LRU
不檢測item對象是否逾時,get時檢查item對象是否應該删除;
删除item對象時,不釋放記憶體,作删除标記,指針方式slot回收插槽,下次配置設定的時候直接使用;
Item是儲存在chunk中的實際資料;
控制記憶體的浪費:
Slab尾部剩餘空間規劃:
slab=chunk*n整數倍;使用合适的factor:
啟動方式:
-d 以守護程式(daemon)方式運作
-u root 指定使用者,如果目前為 root ,需要使用此參數指定使用者
-P /tmp/a.pid儲存PID到指定檔案
記憶體設定:
-m 1024 資料記憶體數量,不包含memcached本身占用,機關為 MB
-M 記憶體不夠時禁止LRU,報錯
-n 48初始chunk=key+suffix+value+32結構體,預設48位元組
-f 1.25 增長因子,預設1.25
-L啟用大記憶體頁,可以降低記憶體浪費,改進性能
連接配接設定:
-l 127.0.0.1 監聽的 IP 位址,本機可以不設定此參數
-p 11211 TCP端口,預設為11211,可以不設定
-U 11211 UDP端口,預設為11211,0為關閉
并發設定:
-c 1024最大并發連接配接數,預設1024,最好是200
-t 4線程數,預設4。由于memcached采用NIO,是以更多線程沒有太多作用
-R 20每個event連接配接最大并發數,預設20
-C禁用CAS指令(可以禁止版本計數,減少開銷)
舉例:/usr/local/bin/memcached -d -u nobody -m 1024 -p 11210 -l 10.11.12.70 -P /opt/memcached/pid/m11210.pid
Memcached指令清單;
存儲指令:set/add/replace/append/prepend/cas
讀取指令:get/gets
删除指令:delete
計數指令:incr/decr
統計指令:stats/settings/items/sizes/slabs/
工具指令:memcached-tool
set無論如何都進行存儲
add隻有資料不存在時進行添加
repalce隻有資料存在時進行替換
cas按版本号更改 cas 即 check and set,隻有版本号相比對時才進行存儲,否則傳回exists (設計意圖: 解決多個用戶端并發修改同一條記錄的問題,防止使用經過改變了的value/key 對)
stats統計項:
分析CPU占用是否過高:
rusage_system:該程序累計的系統時間 /s
rusage_user:該程序累計的使用者時間 /s
分析連接配接數是否太多:
curr_connections:目前連接配接數
total_connections:memcached 自運作以來接受的連接配接總數
分析命中率是否太低:
Cmd_get 查詢請求總數
Get_hits 查詢成功擷取資料的總次數
Get_missess 查詢成功未取到資料的總次數
分析位元組數量:
Bytes memcached目前存儲内容所占總位元組數
Bytes read memcached從網絡讀取到的總位元組數
Bytes written memcached 向網絡發送的總位元組數
分析對象數LRU頻率:
Curr_items memcached目前存儲的item數量
Total_items memcached 啟動以來存儲過的内容總數
Evictions LRU釋放對象數,用來釋放記憶體
Stats settings 檢視設定:
Maxbytes 最大位元組數限制
Maxconns 允許最大連接配接數
Tcport
Udpport
Evictions on/off 是否禁用LRU
Growth_factor 增長因子 (每個slab class 增長的倍數,預設為1.25)
Chunk size key+valus+flags大小
Num_threads 線程數,可通過-t設定,預設為4(一般標明為CPU核數)
Stats sizes 對象數量統計 Look:會鎖定服務,暫停處理請求:
顯示的格式: stat <size> <count>
Stats slabs 區塊統計:
Chunk_size : chunk 大小,byte
Chunks_per_page : 每個page的chunk 數量
Total_pages : pages 數量
Total_chunks = chunk數量* page數量
其他指令; flush_all 清除所有資料
Echo flush_all | nc localhost 11210
UDP協定:
TCP 連接配接用戶端過多時選用;
允許少量的操作失敗??
可以使用replaced來實作Memcached主從複制!
部分不足:
Can’t dump 無法備份,重新開機無法恢複
沒有持久化,重新開機全部丢失
單點故障failover
崩潰沒法查找原因
任何機器都可以telnet,需要放在防火牆後
記憶體問題
LRU是slab局部,沒有全局
有空間浪費
沒有合理的日志
叢集增加機器成本
FAQ:
1、memcached能接受的key的最大長度是250個字元
250是memcached伺服器端内部的限制。如果使用的Memcached用戶端支援"key的字首"或類似特性,那麼key(字首+原始key)的最大長度是可以超過250個字元的。推薦使用較短的key,這樣可以節省記憶體和帶寬。
2、單個item的大小被限制在1M byte之内
每個slab隻負責一定範圍内(chunk資料大小決定)的資料存儲。每個slab隻存儲大于其上一個slab的size并小于或者等于自己最大size的資料。
Memcached的記憶體存儲引擎,使用slabs來管理記憶體。記憶體被分成大小不等的slabs chunks(先分成大小相等的slabs,然後每個slab被分成大小相等chunks,不同slab的chunk大小是不相等的)。chunk的大小依次從一個最小數開始,按某個因子增長,直到達到最大的可能值。如果最小值為400B,最大值是1MB,因子是1.20,各個slab的chunk的大小依次是:slab1 - 400B;slab2 - 480B;slab3 - 576B ...slab中chunk越大,它和前面的slab之間的間隙就越大。是以,最大值越大,記憶體使用率越低。Memcached必須為每個slab預先配置設定記憶體,是以如果設定了較小的因子和較大的最大值,會需要為Memcached提供更多的記憶體。
不要嘗試向memcached中存取很大的資料,例如把巨大的網頁放到mencached中。因為将大資料load和unpack到記憶體中需要花費很長的時間,進而導緻系統的性能反而不好。如果确實需要存儲大于1MB的資料,可以修改slabs.c:POWER_BLOCK的值,然後重新編譯memcached;或者使用低效的malloc/free。另外,可以使用資料庫、MogileFS等方案代替Memcached系統。
3、memcached的記憶體配置設定器是如何工作的?為什麼不适用malloc/free!?為何要使用slabs?
預設會使用内部的slab配置設定器,而且确實應該使用内建的slab配置設定器。最早的時候,memcached隻使用malloc/free來管理記憶體。然而,這種方式不能與OS的記憶體管理以前很好地工作。反複地malloc/free造成了記憶體碎片,OS最終花費大量的時間去查找連續的記憶體塊來滿足malloc的請求,而不是運作memcached程序。slab配置設定器就是為了解決這個問題而生的。記憶體被配置設定并劃分成chunks,一直被重複使用。因為記憶體被劃分成大小不等的slabs,如果item的大小與被選擇存放它的slab不是很合适的話,就會浪費一些記憶體。
4、memcache已經配置設定的記憶體不會再主動清理
5、memcache配置設定給某個slab的記憶體頁不能再配置設定給其他slab。
6、flush_all不能重置memcache配置設定記憶體頁的格局,隻是給所有的item置為過期。(LRU不是全局的,而是針對Slab而言的,是以可能會造成新資料被清楚掉;隻有delete掉才能釋放記憶體)
<b></b>
<b>本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1299855,如需轉載請自行聯系原作者</b>