`

memcached java client性能测试的几点疑问和说明

阅读更多

最近java memcached client发布了2.6.1版本,号称性能提升了300%,这是相对于原始主干代码来说。这个改进是由国人做的一个分支,首先得向他们致敬,great job。

 

我这里想谈的主要是这个新闻里的性能测试,从他们的测试结果来看java memcached client的性能确实非常优秀。但是我认为这个测试并不能算非常公平的测试,有几点需要开发者来澄清和说明一下。

 

抛开硬件声明不谈,软件上的配置没有说明,比如各个软件的版本,测试的各个client的参数设置没有说明。为了证明xmemcached可以做到比测试中的更优秀,我也做了个简单测试,我测试的场景如下:

 

并发n个(1,10,50,100,300)线程存取memcached数据,数据大小为64字节,存取次数随并发程度递增,读写比例为4:1。测试的客户端用java memcached client 2.6.1和xmemcachd 1.3.3。memcached版本为1.4.5,内存开大为4G。两者的配置如下

 

java memcached client

 

                BasicConfigurator.configure();
		SockIOPool pool = SockIOPool.getInstance();
		pool.setMinConn(10);
		pool.setMaxConn(20);
		pool.setMaxIdle(60 * 60 * 1000);
		pool.setServers(servers.split(" "));
		pool.initialize();

 

xmemcached

 

 

MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil
				.getAddresses(servers));
builder.setConnectionPoolSize(20);

 

连接数都设置成20个,我们看下测试的结果。

 

java memcached client

 

 

warm up
threads=1,repeats=40000,valueLength=64,tps=9207,miss=0,fail=0,hit=32004,all=40000,hitRate=1.00
threads=10,repeats=40000,valueLength=64,tps=51788,miss=0,fail=0,hit=320040,all=400000,hitRate=1.00
threads=50,repeats=40000,valueLength=64,tps=90019,miss=0,fail=0,hit=1600200,all=2000000,hitRate=1.00
threads=100,repeats=40000,valueLength=64,tps=90610,miss=0,fail=0,hit=3200400,all=4000000,hitRate=1.00
threads=300,repeats=40000,valueLength=64,tps=86025,miss=0,fail=0,hit=9601200,all=12000000,hitRate=1.00
 

xmemcached:

 

threads=1,repeats=40000,valueLength=64,tps=6513,miss=0,fail=0,hit=32004,all=40000,hitRate=1.00
threads=10,repeats=40000,valueLength=64,tps=38763,miss=0,fail=0,hit=320040,all=400000,hitRate=1.00
threads=50,repeats=40000,valueLength=64,tps=102081,miss=0,fail=0,hit=1600200,all=2000000,hitRate=1.00
threads=100,repeats=40000,valueLength=64,tps=124928,miss=0,fail=0,hit=3200400,all=4000000,hitRate=1.00
threads=300,repeats=40000,valueLength=64,tps=149125,miss=0,fail=0,hit=9601200,all=12000000,hitRate=1.00

 

可以看到,在1个或者10个线程并发的时候,xmc确实比java memcached client差,但是随着并发程度的升高,xmc都超过了java memcached client,顶峰可以达到接近15万的tps。那么,如果java memcached client使用更多的连接池呢,比如200个连接,结果如下

 

 

Java-MemCached startup
warm up
threads=1,repeats=40000,valueLength=64,tps=9248,miss=0,fail=0,hit=32004,all=40000,hitRate=1.00
threads=10,repeats=40000,valueLength=64,tps=50881,miss=0,fail=0,hit=320040,all=400000,hitRate=1.00
threads=50,repeats=40000,valueLength=64,tps=87111,miss=0,fail=0,hit=1600200,all=2000000,hitRate=1.00
threads=100,repeats=40000,valueLength=64,tps=87563,miss=0,fail=0,hit=3200400,all=4000000,hitRate=1.00
threads=300,repeats=40000,valueLength=64,tps=85685,miss=0,fail=0,hit=9601200,all=12000000,hitRate=1.00
 

从结果来看,并没有明显的改善。

 

 

软件配置是我想说的第一个测试中没提到的因素。第二个因素是java memcached client 2.6.1去掉了数据压缩功能,那么在测试大数据的时候,是否将其他客户端的数据压缩功能关掉,这个因素对测试结果的影响很大。我将xmemcached的压缩阈值设置成1M,准备再测试看看,结果稍候奉上。

 

 

 

 

分享到:
评论
6 楼 thinkingmysky 2013-11-23  
楼主,你确定,java memached client能处理并发吗? 而且设置也有问题,无法控制池的回收,并且它根本不能控制,在并发一个时间节点,突然400-1000并发访问,如果你设置max最大为60,它依然能无限网上增长!
5 楼 student007 2012-04-13  
你好,我使用的是memcache1.4.4 xmemcached1.3.5 是和spring2.5.6整合的,
但 系统运行一段时间后,就会报错,一直是 try reconnect memcache,部分异常见下:
java.util.concurrent.TimeoutException: Timed out(5000) waiting for operation
        at net.rubyeye.xmemcached.XMemcachedClient.latchWait(XMemcachedClient.java:2528)
        at net.rubyeye.xmemcached.XMemcachedClient.fetch0(XMemcachedClient.java:574)
        at net.rubyeye.xmemcached.XMemcachedClient.get0(XMemcachedClient.java:971)
        at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:929)
        at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:940)
        at net.rubyeye.xmemcached.XMemcachedClient.get(XMemcachedClient.java:962)

只要出现了这样的一次 mem就不能使用了,但mem的服务端是好的(但不排除服务有些参数设置不当)。您能不能帮忙给看看这个问题,我qq 490836924 。
4 楼 agapple 2011-06-29  
哈哈,xmemcached还是很v5的。
现在公司里也有2个memcache客户端实现,从他们的性能测试来看,xmemcached的性能还是很难超越。
3 楼 peterwei 2011-06-29  
哈哈,boyan不淡定了。不过xmc确实不错,一直在用。期待进一步测试结果。
2 楼 dennis_zane 2011-06-29  
NanguoCoffee 写道
LZ 是boyan吧。
呵呵,我一直在xmemcached,挺好用的。

从上面的比较测试来看,xmemcached找到了提升的空间地方(1-10并发数时的性能)。


嗯,我就是伯岩

这个很难提升,低并发的时候,nio比bio要多不少的context switch。
1 楼 NanguoCoffee 2011-06-29  
LZ 是boyan吧。
呵呵,我一直在xmemcached,挺好用的。

从上面的比较测试来看,xmemcached找到了提升的空间地方(1-10并发数时的性能)。

相关推荐

    java使用Memcached简单教程

    为了提高系统的健壮性和可用性,可以考虑以下几点: 1. **优化配置**:合理配置Memcached的各项参数,如内存大小、连接数等。 2. **集群部署**:使用多个Memcached实例构建集群,通过负载均衡来分发请求,提高处理...

    基于memcached client for java的cache封装

    封装Memcached客户端主要涉及以下几点: 1. **连接管理**:初始化Memcached客户端,设置服务器地址、端口和连接池大小等配置。这通常在应用启动时完成,确保服务可用。 2. **操作接口**:创建一套简洁易用的操作...

    memcached java源码(master分支)

    7. **测试套件**:为了保证代码质量,通常会有单元测试和集成测试,测试各种操作的正确性和性能。 8. **配置与扩展性**:客户端可能会提供灵活的配置选项,如服务器列表、超时设置、连接策略等,以适应不同的部署...

    java_memcached-release_2.5.1

    用好Cache,优化应用 服务集成平台5.6的性能测试进入尾声,这期的优化也算告一段落。这次主要的优化工作还是在三个方面:应用服务器(Apache,JBoss)配置,业务流程,Cache Client包...当前主要采用了以下几点策略:

    memcached1

    最近一直在做一个项目的前期设计工作,考虑到后期系统的扩展和性能问题也找了很多解决方法,有一个就是用到了数据库的缓存工具memcached(当然该工具并不仅仅局限于数据库的缓存)。先简单的介绍下什么是memcached。...

    Memcached 客户端 服务端 管理工具

    客户端是应用与Memcached交互的接口,常见的客户端库有libmemcached(C语言)、pylibmc(Python)和memcached-client(Java)等。客户端的主要任务包括: - **连接管理**:建立与服务端的TCP连接或Unix域套接字连接...

    tomcat6+session+memcached

    【标题】"tomcat6+session+memcached" 涉及的知识点主要集中在Web...通过以上知识点的讲解,我们可以了解到如何在Tomcat6环境中使用Java 7和Memcached来实现高效的Session共享,从而提升Web应用的可扩展性和用户体验。

    win7 64位 memcached springmvc memcached jar包

    在IT行业中,尤其是在Java Web开发领域,`Memcached`是一个广泛应用的分布式内存缓存系统,它可以帮助提升应用程序的性能和响应速度。`SpringMVC`是Spring框架的一部分,专门用于构建MVC(Model-View-Controller)...

    Memcached客户端手册

    # Memcached客户端手册知识点详解 ## 一、Memcached简介与使用入门 ### 1.1 Memcached概述 ...通过这些知识点的学习,读者可以更好地理解和掌握如何在实际项目中利用Memcached提升系统的性能和响应速度。

    memcached-1.4.29.tar.gz

    为了最大化性能,可以考虑以下几点: 1. 调整内存分配:根据服务器资源,合理设置memcached分配的内存大小。 2. 使用压缩:启用数据压缩可以减少内存占用,但会增加CPU负担。 3. 避免大键值:尽量保持键和值的大小较...

    java开源包1

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    Memcached的封装优化及相关操作api

    **Memcached** 是一款高性能、分布式...通过上述知识点,开发者可以更好地理解和使用Memcached,提高应用的性能和响应速度。在实际项目中,结合具体需求对Memcached进行封装和优化,将使缓存系统的使用更加高效和便捷。

    Memcache比较完整的简单demo

    为了最大化Memcached的性能,可以考虑以下几点: - 使用合适的数据结构:尽量减少每次存取的数据量,避免频繁的小数据操作。 - 负载均衡:在多台服务器上部署Memcached,通过负载均衡器分散请求。 - 数据预热:在...

    java开源包4

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包6

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包9

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包101

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包5

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包8

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包10

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics