在学习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