关于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。客户端配置如下:

关于Memcached Java Client 的 Direct buffer memory

测试类参数

测试类参数:线程数:20,每个线程处理10000次。基本可以执行个1,2分钟,够监控连接情况了。

2.5.1版本测试


关于Memcached Java Client 的 Direct buffer memory

查看测试前memcached服务状态

telnet localhost 11211  
Stats  

关于Memcached Java Client 的 Direct buffer memory
 运行测试
异常了:

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服务状态:
 
关于Memcached Java Client 的 Direct buffer memory
 
从测试结果看,大并发的时候,2.5.1版本配置的连接池最大5连接,但是实际是118-10=108个,连接池完全失控,客户端报错java.lang.OutOfMemoryError。BUG!!

2.6.1版本测试


关于Memcached Java Client 的 Direct buffer memory

还是先查看下运行测试前,memcached服务器状态:
 
关于Memcached Java Client 的 Direct buffer memory
 
回到了当前连接为10,不晓得为什么!官方说该参数是当前连接数量,但是我现在明显没有连接,就有10个,而且服务器刚启动就10个,先不管,反正无连接的时候就是10(我用netstat –a看了,的确没有连接)。

运行2.6.1版本的测试
OK,一切正常了,客户端无异常,服务器状态一直都是显示当前连接为15,说明,只有5个连接到memcached服务器,和配置符合。
 
关于Memcached Java Client 的 Direct buffer memory

测试结论:2.5.1的连接池溢出BUG在2.6.1中的确修复了。

验证:性能提升300%

2.6.1版本的测试已经在上面的“性能测试”模块进行了说明,这里使用相同的配置和代码测试2.5.1版本的情况,然后进行对比。
测试服务器就还是小本,服务开3个,分别128M,64M,64M.
 
关于Memcached Java Client 的 Direct buffer memory
 
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倍
不错,的确优化提升了。
后续会提供源代码的分析比对,现在时间不多,先到这里了。

  • 查看图片附件
分享到: 关于Memcached Java Client 的 Direct buffer memory关于Memcached Java Client 的 Direct buffer memory

相关推荐