有的问题碰到了,在没找到原因之前它就是个绊脚石,绕了几圈没找到答案它可能升级到拦路虎。当一旦被你解决,再去看这个问题觉得真是微不足道,都不好意思跟人打招呼。但时间对于你来说其实没有白费,再小的问题你遇到了并且没有一眼看穿它,就表示你缺泛相关经验,过程中你少不了用一些工具作分析,这些就是你的收获的,问题本身其实就不值一提了。
周二遇到缓存中key比较多时候堆内存泄露的问题周五解决了。
压测环境:(50kb数据,无穷随机生成key使命中率接近0%)
12/04/13 17:21:01 get:100251 put:100253 hit:0.00% get/s:98931 put/s:98933 in:4.78g out:0 12/04/13 17:21:02 get:99486 put:99487 hit:0.00% get/s:99081 put/s:99082 in:4.74g out:0 12/04/13 17:21:03 get:98227 put:98224 hit:0.00% get/s:97639 put/s:97636 in:4.68g out:50.00k 12/04/13 17:21:04 get:97166 put:97165 hit:0.00% get/s:96970 put/s:96969 in:4.63g out:0 12/04/13 17:28:42 get:96675 put:96674 hit:0.00% get/s:96288 put/s:96287 in:4.61g out:0 12/04/13 17:28:43 get:96169 put:96167 hit:0.00% get/s:95782 put/s:95780 in:4.59g out:50.00k 12/04/13 17:28:44 get:96608 put:96606 hit:0.00% get/s:96172 put/s:96170 in:4.61g out:50.00k 12/04/13 17:37:18 get:90064 put:90064 hit:0.00% get/s:89880 put/s:89880 in:4.29g out:50.00k 12/04/13 17:37:19 get:89993 put:89989 hit:0.00% get/s:89633 put/s:89629 in:4.29g out:100.00k 12/04/13 17:37:21 get:97082 put:97084 hit:0.00% get/s:94235 put/s:94237 in:4.63g out:50.00k 12/04/13 18:18:31 get:94784 put:94783 hit:0.00% get/s:94432 put/s:94431 in:4.52g out:50.00k 12/04/13 18:18:32 get:96053 put:96052 hit:0.00% get/s:95856 put/s:95855 in:4.58g out:100.00k 12/04/13 18:18:33 get:93364 put:93362 hit:0.00% get/s:92896 put/s:92894 in:4.45g out:0
机器负载(4CPU):
GC情况:
结论:50kb的对象,命中率为0情况下,put/s:9w, get/s:9w, 内存拷贝流量:4.6g/s
接下来——
1、因为目前key其实是存在堆内,定时对堆内过期中间数据进行清理,后面会考虑将key压成整型存在堆内,key本身也放堆外。
2、寻找一个最佳的序列化方案,备选:protobuff,protostuff,大致看了下protostuff和一些评测数据,很值得期待。
3、MCache大内存(24G? 48G?)测试。从前面的数据看,内存拷贝4.6/g,不会成为应用场景的瓶颈。