MCache压测-2

一些猜想:


MCache的基本概念是对象引用在堆内,对象序列化之后存到堆外。可能存在问题:


1、direct memory将对象存在堆外,涉及到对象在堆内与堆外内存之间的的拷贝,对性能有影响。这一点前面通过调整测试对象的大小对QPS的影响己经初步显现,但是在一般的应用场景下,QPS能到10W左右,这里不会成为瓶颈;


2、序列化与反序列化对性能的影响。这个点预计会对CPU消耗比较大,需要单独优化:


a) 特定场景直接使用byte数组,避免序列化与反序列化开销;


b) 采用一种高效的序列化策略,准备对比:protobuf与protostuff的情况;


3、堆内中间对象对诱发的GC对性能的影响。这个点会存在,优化的方向:


a) 尽可能减少中间对象,使用基本类似,优化对象大小等等。但是只能一定程序上减少GC频率;


b) 对GC调优,存储对象采用有效期,GC需要对过期的对象进行清理。首先有效期时长就需要有平衡策略,直接影响对象生命周期和JVM中对象数,最主要会影响缓存命中率。其次,调整GC代的分配比例,如果多数中间对象能在Eden区或Surv区完成生命周期,那FullGC势必会降低,又或者,调大Old的大小,如果有效期30分钟,Old能容下1-2小时的对象,那也可以接受了。再次,考虑采用CMS分散GC对应用暂停的时长;



4、内存泄漏问题。direct memory因不在heap中,GC无法涉及,direct的回收时机是DirectByteBuffer对象被GC时释放本地内存,没有触发GC就可能出现OOM了。在我们的应用中direct会预分配好,运行时不再涉及到分配与回收的问题,也就是说ByteBuffer是一直在Old中的,因而理论上不会产生泄露的情况;


5、内存分片均衡策略的有效性。MCache采用根据运行时反馈对分片容量以Page为单位作自动调整,采用一种跟memcached很相似的算法,经过几次测试,还是比较有效的,好钢都往刀刃上移动。


机器配置:

Summary: Unknown, 4 x Xeon E5520 2.27GHz, 7.3GB

System: Unknown

Processors: 4 x Xeon E5520 2.27GHz

Memory: 7.3GB

Network: eth0: 00:16:3e:e8:15:81

OS: RHEL Server 5.4 (Tikanga), Linux 2.6.18-164.el5xen x86_64, 64-bit

用例条件:

对象大小在128byte~500k之间随机,key在0~1000000随机,过期时间3s,并发线程数5个.

curl “localhost:8088/perf.do?method=mcache&times=90000000000&min=128&max=502400&key=1000000&expire=3000&threads=5″


MCache配置:

mcache.capacity.total=860m //总direct内存

mcache.capacity.page=1m // 分片大小

mcache.capacity.chunk=512 // 最小块大小

mcache.factor=2 // 块增长因子


堆分区:


Eden 340m, Surv 3m, Old 700m Perm 130m, GC:CMS 详见前一篇。


通过几次测试,MCache和QPS、GC、CPU等都比较稳定在一个范围内(如下图),接下来将调整GC策略。
Old GC:
 



top load基本稳定在5:

top – 14:48:38 up 273 days, 16:12, 4 users, load average: 5.34, 5.21, 5.35

Tasks: 114 total, 1 running, 112 sleeping, 0 stopped, 1 zombie

Cpu(s): 78.4%us, 1.8%sy, 0.0%ni, 19.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.2%st

Mem: 7680000k total, 6732512k used, 947488k free, 800864k buffers

Swap: 2096472k total, 92k used, 2096380k free, 3339640k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

8455 dafu 20 0 2360m 1.9g 11m S 320.1 25.7 250:17.07 java


QPS相关数据:

12/04/06 14:39:27 get:36334 put:978 hit:97.31% qps:18112 avgtime:0

12/04/06 14:39:29 get:40511 put:970 hit:97.61% qps:19975 avgtime:0

12/04/06 14:39:31 get:38543 put:1006 hit:97.39% qps:19175 avgtime:0

12/04/06 14:39:33 get:37736 put:994 hit:97.37% qps:15915 avgtime:0

12/04/06 14:39:35 get:38849 put:1141 hit:97.06% qps:19213 avgtime:0

12/04/06 14:39:37 get:42149 put:1003 hit:97.62% qps:20752 avgtime:0


SLAB均衡情况

slot: 0 chunk size: 4096 perslab: 2 free chunk: 158573 inuse chunk: 3219 evicted: 0
slot: 1 chunk size: 2048 perslab: 2 free chunk: 68422 inuse chunk: 4282 evicted: 0
slot: 2 chunk size: 1024 perslab: 2 free chunk: 27502 inuse chunk: 8534 evicted: 0
slot: 3 chunk size: 512 perslab: 2 free chunk: 1126 inuse chunk: 16904 evicted: 0
slot: 4 chunk size: 8832 perslab: 69 free chunk: 0 inuse chunk: 9074 evicted: 24266
slot: 5 chunk size: 4544 perslab: 71 free chunk: 0 inuse chunk: 4544 evicted: 55718
slot: 6 chunk size: 2272 perslab: 71 free chunk: 0 inuse chunk: 2272 evicted: 109926
slot: 7 chunk size: 1184 perslab: 74 free chunk: 0 inuse chunk: 1216 evicted: 263250
slot: 8 chunk size: 808 perslab: 101 free chunk: 0 inuse chunk: 1198 evicted: 495395
slot: 9 chunk size: 1224 perslab: 306 free chunk: 0 inuse chunk: 2095 evicted: 858828
slot: 10 chunk size: 316 perslab: 158 free chunk: 0 inuse chunk: 1186 evicted: 1281537
slot: 11 chunk size: 2 perslab: 2 free chunk: 71 inuse chunk: 0 evicted: 0


通过jmap将heap dump,观察:


参考:
http://www.kdgregory.com/index.php?page=java.byteBuffer
http://code.google.com/p/gperftools/downloads/list?redir=1

个人资料
0_0
等级:7
文章:111篇
访问:5.0w
排名: 6
上一篇: MCache压力测试-1
下一篇:基于管道模式的容器设计
猜你感兴趣的圈子:
阿里中间件技术交流圈
标签: chunk、perslab、inuse、evicted、mcache、面试题
隐藏