2010年11月24日 星期三

2.理解memcached的內存存儲

From: http://forum.homeserver.com.tw/index.php/topic,3.0.html


Slab Allocation機制:整理內存以便重複使用


最近的memcached默認情況下採用了名為Slab Allocator的機制分配、管理內存。在該機製出現以前,內存的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是,這種方式會導致內存碎片,加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢。Slab Allocator就是為解決該問題而誕生的。


下面來看看Slab Allocator的原理。下面是memcached文檔中的slab allocator的目標:

the primary goal of the slabs subsystem in memcached was to eliminate memory fragmentation issues totally by using fixed-size memory chunks coming from a few predetermined size classes.

也就是說,Slab Allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題。

Slab Allocation的原理相當簡單。 將分配的內存分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk的集合)(圖1)。


圖1 Slab Allocation的構造圖

而且,slab allocator還有重複使用已分配的內存的目的。也就是說,分配到的內存不會釋放,而是重複利用。
Slab Allocation的主要術語

Page

分配給Slab的內存空間,默認是1MB。分配給Slab之後根據slab的大小切分成chunk。

Chunk

用於緩存記錄的內存空間。

Slab Class

特定大小的chunk的組。
在Slab中緩存記錄的原理

下面說明memcached如何針對客戶端發送的數據選擇slab並緩存到chunk中。

memcached根據收到的數據的大小,選擇最適合數據大小的slab(圖2)。 memcached中保存著slab內空閒chunk的列表,根據該列表選擇chunk,然後將數據緩存於其中。


圖2 選擇存儲記錄的組的方法

實際上,Slab Allocator也是有利也有弊。下面介紹一下它的缺點。
Slab Allocator的缺點

Slab Allocator解決了當初的內存碎片問題,但新的機制也給memcached帶來了新的問題。

這個問題就是,由於分配的是特定長度的內存,因此無法有效利用分配的內存。例如,將100字節的數據緩存到128字節的chunk中,剩餘的28字節就浪費了(圖3)。


圖3 chunk空間的使用

對於該問題目前還沒有完美的解決方案,但在文檔中記載了比較有效的解決方案。

The most efficient way to reduce the waste is to use a list of size classes that closely matches (if that's at all possible) common sizes of objects that the clients of this particular installation of memcached are likely to store.

就是說,如果預先知道客戶端發送的數據的公用大小,或者僅緩存大小相同的數據的情況下,只要使用適合數據大小的組的列表,就可以減少浪費。

但是很遺憾,現在還不能進行任何調優,只能期待以後的版本了。但是,我們可以調節slab class的大小的差別。接下來說明growth factor選項。
使用Growth Factor進行調優

memcached在啟動時指定 Growth Factor因子(通過-f選項),就可以在某種程度上控制slab之間的差異。默認值為1.25。但是,在該選項出現之前,這個因子曾經固定為2,稱為「powers of 2」策略。

沒有留言:

張貼留言