在學習Memcached的Slab Allocation過程中,查看默認的Slab和Chunk size分配,如圖1,發現第一個Chunk size=96B,很好奇這個96B是怎么計算的。
圖1 Memcached啟動后的chunk size
Memcached啟動命令有一個選項-n,設置第一個item存儲多少字節的數據,如果沒有指定-n,默認48。該選項參數賦值給settings.chunk_size。
當memcached啟動時,初始化第一個Slab的chunk size首先指定為:
unsigned int size = sizeof(item) + settings.chunk_size;
其中,32位機器item結構是32字節,64位機器item結構是48字節。
然后為了內存字節對齊,size必須是8的整數倍,其中CHUNK_ALIGN_BYTES=8:
if (size % CHUNK_ALIGN_BYTES)
size += CHUNK_ALIGN_BYTES – (size % CHUNK_ALIGN_BYTES);
所以圖1的第一個Slab的chunk size = 48 + 48 = 96B。
啟動memcached時n = 1,按照上面的推算第一個Slab的chunk size = 48 + 1 + 7 = 56B,加7是為了字節對齊,圖2的memcached啟動也驗證推算結果。
![圖2 Memcached啟動命令n=1的chunk size]](http://upload-images.jianshu.io/upload_images/3190591-42a4d03d213324ae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后,當啟動memcached時n = 0,如圖3,報如下錯誤信息:
Chunk size must be greater than 0
圖3 Memcached啟動命令n=0的chunk size