記憶體分配機制Slab Allocation 本文參考博客:https://my.oschina.net/bieber/blog/505458 Memcached的記憶體分配是以slabs為單位的,會根據初始chunk大小、增長因數、存儲數據的大小實際劃分出多個不同的slabs class,slab c ...
記憶體分配機制Slab Allocation
本文參考博客:https://my.oschina.net/bieber/blog/505458
Memcached的記憶體分配是以slabs為單位的,會根據初始chunk大小、增長因數、存儲數據的大小實際劃分出多個不同的slabs class,slab class中包含若幹個等大小的trunk和一個固定48byte的item信息。trunk是按頁存儲的,每一頁成為一個page(預設1M)。
1.slabs、slab class、page三者關係:
slabs = slab Class1 + slab Class2 + ... + Slab Classn
sbal Class = trunkSize * trunkCount * pageCount
trunkCount = pageSize / trunkSize
trunkSize = 實際數據大小 + 48byte(items數據結構)
例:假定每個slab Class的page都是1,則Slab Class1 = 88byte * trunkCount * 1
啟動memcached時用-vv參數key輸出slabs信息,我們可以看到slabs的數據正是基於增長因數遞增的,但是數據會略有誤差~
2.實際數據的存儲會選擇合適的空間,比如我要存儲一個52byte的數據,實際需要100byte空間
52+ 48 = 100byte,會將數據存儲到112bytes所對應的slabls里,占用一個trunk
3.機制記憶體浪費問題:
優點:以前是記憶體分配機制是malloc~free,有記憶體碎片問題。此種機制解決了記憶體碎片問題
缺點:如果增長因數設置的不合適,可能造成空間的浪費問題。因為trunk的大小是固定的,只能是數據去適應trunk的大小(data <=trunk)
記憶體使用機制LRU
當memcached中的數據過期時,並非直接釋放掉相關記憶體,因為沒有響應的監聽來處理這件事。flush_all也一樣不會釋放記憶體,只是這些失效數據對用戶透明,用戶無法檢索到這些數據。Memcached已分配的記憶體不會進行回收操作,但是可以進行重利用操作。Memcached會優先使用已經過期的記憶體。當記憶體不足時,通過LRU機制將長期不使用的記憶體分配給新的記錄。
註意:啟動參數帶-M的不支持LRU操作
常用監控
telnet命令行,直接操作stats、stats slabs等命令進行分析
Memcached.php =》 php系統使用apache服務,圖形化界面
daemontools =》 不知道是啥,先記下來
Nagios =》 checktcp =》 不知道是個啥,先記下來
優化思路
1.合理的增長因數 => 控制記憶體的合理消耗
2.緩存更新機制 => 在快要失效的時候更新緩存