关于Memcached Java Client 的 Direct buffer memory
Memcached Java Client 版本差异
公司目前使用的是2.5.1版本的memcached java client.目前官方最新版本是2.6.1,是基于全新的performance分支,由Schooner中国团队开发。
• 王新根,[email protected];
• 李蒙,[email protected],IT eye博客地址是:http://menglee.iteye.com 。
与老版本的相比的重大改善:
1. 较之老版本,在性能上有300%左右的提升;
2. 兼容老版本,用户无须修改自己的源代码;
3. 支持多个memcached协议,包括text,udp和binary协议;
4. 支持SASL认证机制;
5. 重新实现的连接池,修复了之前的连接数太多所导致的OutOfMemory异常;
6. 加入了slf4j logger支持,使得开发人员可以方便的记录日志;
7. 支持自定义的对象序列化方法。
对上面官方描述的重大改善,我下面挑选了2个比较实用的改善进行测试验证,毕竟试了才知道,呵呵。
验证:连接池BUG修复
验证:重新实现的连接池,修复了之前的连接数太多所导致的OutOfMemory异常。
验证测试的环境我还是使用上面的性能测试基础环境和代码。
测试环境配置
在上面性能测试基础环境中,我关掉了2个memcached服务,只留下一个11211端口的服务。
Memcached java client客户端参数配置,配置一个服务和连接池配置最大连接数量为5。客户端配置如下:
测试类参数
测试类参数:线程数:20,每个线程处理10000次。基本可以执行个1,2分钟,够监控连接情况了。
2.5.1版本测试
查看测试前memcached服务状态
telnet localhost 11211 Stats
运行测试
异常了:
Exception in thread "pool-1-thread-16" java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.reserveMemory(Bits.java:633) at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:98) at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
查看运行中memcached服务状态:
从测试结果看,大并发的时候,2.5.1版本配置的连接池最大5连接,但是实际是118-10=108个,连接池完全失控,客户端报错java.lang.OutOfMemoryError。BUG!!
2.6.1版本测试
还是先查看下运行测试前,memcached服务器状态:
回到了当前连接为10,不晓得为什么!官方说该参数是当前连接数量,但是我现在明显没有连接,就有10个,而且服务器刚启动就10个,先不管,反正无连接的时候就是10(我用netstat –a看了,的确没有连接)。
运行2.6.1版本的测试
OK,一切正常了,客户端无异常,服务器状态一直都是显示当前连接为15,说明,只有5个连接到memcached服务器,和配置符合。
测试结论:2.5.1的连接池溢出BUG在2.6.1中的确修复了。
验证:性能提升300%
2.6.1版本的测试已经在上面的“性能测试”模块进行了说明,这里使用相同的配置和代码测试2.5.1版本的情况,然后进行对比。
测试服务器就还是小本,服务开3个,分别128M,64M,64M.
Memcahced java client 配置如下:
memcached-servers=localhost:11211,localhost:11212,localhost:11213 memcached-weights=3,1,1 memcached-initConn=5 memcached-minConn=5 memcached-maxConn=250
测试类配置:
/** 线程数 */ static int THREAD_COUNT = 20; /** 每线程执行次数 */ static int PER_THREAD_COUNT = 10000;
测试结果:
36316 - Test thread: 20; total times: 404056ms;count/thread: 60000
36316 - add success : 197583; success rate: 98.7915%
36316 - set success : 198272; success rate: 99.136%
36316 - get success : 198473; success rate: 992365.06%
36316 - gets success : 198214; success rate: 99.106995%
36316 - cas success : 198821; success rate: 99.4105%
36318 - del success : 199198; success rate: 99.599%
36318 - Average time: 0.33671334
36318 - add TPS: 4952.211162283959; time: 40386ms
36318 - set TPS: 3645.2447781868555; time: 54866ms
36318 - get TPS: 3217.2961842867253; time: 62164ms
36319 - gets TPS: 2691.0294533173665; time: 74321ms
36319 - cas TPS: 2337.5135867977233; time: 85561ms
36319 - del TPS: 2673.510854454069; time: 74808ms
36319 - Average TPS: 2474.9044686875086
2.6.1版本的测试Average TPS:6624.183569375075
2.5.1版本的测试Average TPS: 2474.9044686875086
效率提升:6624.183569375075/2474.9044686875086=2.68倍
不错,的确优化提升了。
后续会提供源代码的分析比对,现在时间不多,先到这里了。