保存数据之前监控slabs信息如下
[root@hadoop1 hadoop]# echo stats slabs | nc 127.0.0.1 11211
STAT active_slabs 0
STAT total_malloced 0 保存数据之后监控slabs信息如下
set key 1 1 1
1
STORED
set key2 1 0 1
1
STORED
set key2 1 0 1
1
STORED
set key3 1 0 1
3
STORED
[root@hadoop1 hadoop]# echo stats slabs | nc 127.0.0.1 11211
STAT 1:chunk_size 80
STAT 1:chunks_per_page 13107
STAT 1:total_pages 1
STAT 1:total_chunks 13107
STAT 1:used_chunks 2
STAT 1:free_chunks 13105
STAT 1:free_chunks_end 0
STAT 1:mem_requested 108
STAT 1:get_hits 0
STAT 1:cmd_set 4
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048560
END 通过分析日志,可以很清楚的知道,发起的操作记录。
共发起了4个set或add操作.使用了2个大小为80的chunk。
值得一提下,保存的数据都非常小,却占用了160字节。好心疼浪费的存储空间啊。
通过监控total_malloced指标,还验证了,memcached采用预分配,分组管理方式。
当真正有数据保存时,才真正分配内存空间。而且,只有slab class被使用了之后,才能通过stat slabs监控到。
2.内存如何回收
内存回收不太方便验证,LRU算法使用情况,我们可以从侧面验证下。
我的演练思路:批量添加等大小的数据。然后dump出想要数据,确认下最小的KEY。
虽然简单粗暴,但大体可以说明LRU算法吧。
2.1 准备批量添加数据代码
使用的是《memcached演练(2) 访问memcached服务 》提到的spymemcached
public void test111() throws ExecutionException, InterruptedException {
final MemcachedClient mcc = MemcachedUtil.getSpyMemcachedClient();
final Lock lock = new ReentrantLock();
final String value="abcdef.....";
//不停的set值
Thread t1= new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i