论坛首页 Java企业应用论坛

令人振奋的结果:memcached 访问速度达到66000TPS

浏览 20155 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-02  
codeutil 写道
javabean实现Externalizable 接口,自己实现byte转换,就可以不依赖描述信息。
bdb无非也是用bind接口来干同样的事情而已。

sdh5724 写道
最近,我陷入一个郁闷。 就是JAVA的序列化问题。
当你向MEMCACHED直接写序列化的对象的时候, 一个对象完整的描述将会被写进memcached。 那么如果写1000W个对象给memcached, 对象描述将会被写无数次。 序列化描述大小往往远远大于对象的实际数据的, 因此, 我们的内存就被大量这些信息浪费了。 谁解决了这个问题? 我在研究berkleydb java edition的解决方案。 这个问题对于内存节约使用是非常重要的。 我现在4台memcache机器吃了我20G内存, 再涨下去, 就要买机器了。 很不划算啊。



楼上的,看来你确实没有注意到这位朋友说的话。不妨可以一试。而且这位朋友已经实现了,呵呵
0 请登录后投票
   发表时间:2008-11-02  
我花了点时间对 spmemcache 和 楼主的 commons-client 做了一下测试。测试代码采用楼主的源码中的测试代码写法。

主要变量:线程数thread,最大值repeat。
我略微修改了一下楼主的MemcacheClient中的 测试代码, 将 write,read分开。

key,value策略: key,value 相同,1 - repeat , 其中repeat是最大值

(测试环境:
硬件:机器: 酷睿T2350,1.86G双核,2G内存。
系统1:XP,运行memcached客户端测试。 测试程序,JDK1.6.0_10, -Xmx=160m
系统2:Ubuntu 8.0.4,运行于VMWare虚拟机中。memcached 1.2.6 + libevent 1.3, memcached 进程 1个,32M内存,最大256并发连接
)

引用

1  spymemcache测试结果

1线程
write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=21367 , using time:468
read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3516 , using time:2844

10线程
write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=14712 , using time:6797
read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=5258 , using time:19016

50线程
write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=8355 , using time:59844
read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5631 , using time:88781


2 commons-client测试结果

1线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=2806 , using time:3563
INFO [main] (MemcachedClient.java:309) - read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3351 , using time:2984

10线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=5855 , using time:17078
INFO [main] (MemcachedClient.java:309) - read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=4815 , using time:20765

50线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=5856 , using time:85375
INFO [main] (MemcachedClient.java:309) - read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5612 , using time:89094


测试结果可能没楼主的TPS大,只反映我机器上的结果。主要是有同样的测试基准才好对比。

从测试结果看spymemcached的 velocity反映较好一些。spymemcache client, commons-client都 用了nio。
其中read性能表现较低,不知为什么?

我将测试类附上,楼主可以分析一下结果。或者也对 spymemcache做做测试。
0 请登录后投票
   发表时间:2008-11-02  
raymond2006k 写道

我花了点时间对 spmemcache 和 楼主的 commons-client 做了一下测试。测试代码采用楼主的源码中的测试代码写法。

主要变量:线程数thread,最大值repeat。
我略微修改了一下楼主的MemcacheClient中的 测试代码, 将 write,read分开。

key,value策略: key,value 相同,1 - repeat , 其中repeat是最大值

(测试环境:
硬件:机器: 酷睿T2350,1.86G双核,2G内存。
系统1:XP,运行memcached客户端测试。 测试程序,JDK1.6.0_10, -Xmx=160m
系统2:Ubuntu 8.0.4,运行于VMWare虚拟机中。memcached 1.2.6 + libevent 1.3, memcached 进程 1个,32M内存,最大256并发连接
)
引用
1  spymemcache测试结果

1线程
write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=21367 , using time:468
read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3516 , using time:2844

10线程
write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=14712 , using time:6797
read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=5258 , using time:19016

50线程
write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=8355 , using time:59844
read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5631 , using time:88781


2 commons-client测试结果

1线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=2806 , using time:3563
INFO [main] (MemcachedClient.java:309) - read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3351 , using time:2984

10线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=5855 , using time:17078
INFO [main] (MemcachedClient.java:309) - read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=4815 , using time:20765

50线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=5856 , using time:85375
INFO [main] (MemcachedClient.java:309) - read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5612 , using time:89094

测试结果可能没楼主的TPS大,只反映我机器上的结果。主要是有同样的测试基准才好对比。

从测试结果看spymemcached的 velocity反映较好一些。spymemcache client, commons-client都 用了nio。
其中read性能表现较低,不知为什么?

我将测试类附上,楼主可以分析一下结果。或者也对 spymemcache做做测试。


多谢反馈,
raymond2006k 写道

我花了点时间对 spmemcache 和 楼主的 commons-client 做了一下测试。测试代码采用楼主的源码中的测试代码写法。

主要变量:线程数thread,最大值repeat。
我略微修改了一下楼主的MemcacheClient中的 测试代码, 将 write,read分开。

key,value策略: key,value 相同,1 - repeat , 其中repeat是最大值

(测试环境:
硬件:机器: 酷睿T2350,1.86G双核,2G内存。
系统1:XP,运行memcached客户端测试。 测试程序,JDK1.6.0_10, -Xmx=160m
系统2:Ubuntu 8.0.4,运行于VMWare虚拟机中。memcached 1.2.6 + libevent 1.3, memcached 进程 1个,32M内存,最大256并发连接
)
引用
1  spymemcache测试结果

1线程
write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=21367 , using time:468
read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3516 , using time:2844

10线程
write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=14712 , using time:6797
read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=5258 , using time:19016

50线程
write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=8355 , using time:59844
read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5631 , using time:88781


2 commons-client测试结果

1线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=2806 , using time:3563
INFO [main] (MemcachedClient.java:309) - read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3351 , using time:2984

10线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=5855 , using time:17078
INFO [main] (MemcachedClient.java:309) - read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=4815 , using time:20765

50线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=5856 , using time:85375
INFO [main] (MemcachedClient.java:309) - read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5612 , using time:89094

测试结果可能没楼主的TPS大,只反映我机器上的结果。主要是有同样的测试基准才好对比。

从测试结果看spymemcached的 velocity反映较好一些。spymemcache client, commons-client都 用了nio。
其中read性能表现较低,不知为什么?

我将测试类附上,楼主可以分析一下结果。或者也对 spymemcache做做测试。



多谢反馈,我没有用windows测过,不知道有没有关系。另外你把线程数加到100试试。commons-client比较适合高并发的情况,并发不高反而没有优势。

你测试时候的两个系统是在一台物理机器上么?

spymemcached我没测试过,待会看看。
0 请登录后投票
   发表时间:2008-11-02  
raymond2006k 写道

我花了点时间对 spmemcache 和 楼主的 commons-client 做了一下测试。测试代码采用楼主的源码中的测试代码写法。

主要变量:线程数thread,最大值repeat。
我略微修改了一下楼主的MemcacheClient中的 测试代码, 将 write,read分开。

key,value策略: key,value 相同,1 - repeat , 其中repeat是最大值

(测试环境:
硬件:机器: 酷睿T2350,1.86G双核,2G内存。
系统1:XP,运行memcached客户端测试。 测试程序,JDK1.6.0_10, -Xmx=160m
系统2:Ubuntu 8.0.4,运行于VMWare虚拟机中。memcached 1.2.6 + libevent 1.3, memcached 进程 1个,32M内存,最大256并发连接
)
引用
1  spymemcache测试结果

1线程
write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=21367 , using time:468
read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3516 , using time:2844

10线程
write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=14712 , using time:6797
read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=5258 , using time:19016

50线程
write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=8355 , using time:59844
read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5631 , using time:88781


2 commons-client测试结果

1线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=2806 , using time:3563
INFO [main] (MemcachedClient.java:309) - read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3351 , using time:2984

10线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=5855 , using time:17078
INFO [main] (MemcachedClient.java:309) - read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=4815 , using time:20765

50线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=5856 , using time:85375
INFO [main] (MemcachedClient.java:309) - read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5612 , using time:89094

测试结果可能没楼主的TPS大,只反映我机器上的结果。主要是有同样的测试基准才好对比。

从测试结果看spymemcached的 velocity反映较好一些。spymemcache client, commons-client都 用了nio。
其中read性能表现较低,不知为什么?

我将测试类附上,楼主可以分析一下结果。或者也对 spymemcache做做测试。


测试类在那儿?
0 请登录后投票
   发表时间:2008-11-02  
raymond2006k 写道

我花了点时间对 spmemcache 和 楼主的 commons-client 做了一下测试。测试代码采用楼主的源码中的测试代码写法。

主要变量:线程数thread,最大值repeat。
我略微修改了一下楼主的MemcacheClient中的 测试代码, 将 write,read分开。

key,value策略: key,value 相同,1 - repeat , 其中repeat是最大值

(测试环境:
硬件:机器: 酷睿T2350,1.86G双核,2G内存。
系统1:XP,运行memcached客户端测试。 测试程序,JDK1.6.0_10, -Xmx=160m
系统2:Ubuntu 8.0.4,运行于VMWare虚拟机中。memcached 1.2.6 + libevent 1.3, memcached 进程 1个,32M内存,最大256并发连接
)
引用
1  spymemcache测试结果

1线程
write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=21367 , using time:468
read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3516 , using time:2844

10线程
write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=14712 , using time:6797
read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=5258 , using time:19016

50线程
write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=8355 , using time:59844
read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5631 , using time:88781


2 commons-client测试结果

1线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=1, repeat=10000,size=1, all=10000 ,velocity=2806 , using time:3563
INFO [main] (MemcachedClient.java:309) - read test: thread num=1, repeat=10000,size=1, all=10000 ,velocity=3351 , using time:2984

10线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=10, repeat=10000,size=1, all=100000 ,velocity=5855 , using time:17078
INFO [main] (MemcachedClient.java:309) - read test: thread num=10, repeat=10000,size=1, all=100000 ,velocity=4815 , using time:20765

50线程
INFO [main] (MemcachedClient.java:282) - write test:thread num=50, repeat=10000,size=1, all=500000 ,velocity=5856 , using time:85375
INFO [main] (MemcachedClient.java:309) - read test: thread num=50, repeat=10000,size=1, all=500000 ,velocity=5612 , using time:89094

测试结果可能没楼主的TPS大,只反映我机器上的结果。主要是有同样的测试基准才好对比。

从测试结果看spymemcached的 velocity反映较好一些。spymemcache client, commons-client都 用了nio。
其中read性能表现较低,不知为什么?

我将测试类附上,楼主可以分析一下结果。或者也对 spymemcache做做测试。


有点事情要出去一下,先说一下分析结果,比较仓促,不一定对。

commons-client 在windows和linux下性能相差比较大,怀疑和不同thread操作系统下的实现相关,明天我回公司做一下测试。

spymemcached的set方法是异步的,他没有等待返回结果,所以比同步的get方法快,有点不公平,呵呵。

spymemcached用了一些spy的底层实现,而且不是开源的,不好分析,头痛,明天具体测一下好了。


0 请登录后投票
   发表时间:2008-11-02  
引用

有点事情要出去一下,先说一下分析结果,比较仓促,不一定对。

commons-client 在windows和linux下性能相差比较大,怀疑和不同thread操作系统下的实现相关,明天我回公司做一下测试。

spymemcached的set方法是异步的,他没有等待返回结果,所以比同步的get方法快,有点不公平,呵呵。

spymemcached用了一些spy的底层实现,而且不是开源的,不好分析,头痛,明天具体测一下好了。



只是希望对你的开源项目有所帮助。另外你的代码里
start 参数, cdl 参数 似乎只看到传入,没看到使用,这是我的一点疑问,请赐教,呵呵。

你说的有道理。今天是在家里本本上 windows+ubuntu 测试的。
明天回公司再全用linux测测。 其实 spymemcache 的 MemcacheClient类也有点问题,比较原始,像一个connection,需要再做pool化才行,50个thread时,由于量大,已经 内存暴了,加大到 160m才行 ; 好像 javaeye 的 wenchu 已经对 whalin 做了封装,明天我测测whalin 。

另外,我觉得测压力,thread 到一定值就可以了,一般服务器系统thread pool到一定数值就可以了,有pool就可以应付高并发了, 只要用非阻塞io就能保证性能。 大系统主要看memcached 对海量数据的处理能力,如集群时的性能和可靠性。


因为最近要选型,几种client 都要用用才行,最后会选一种。
0 请登录后投票
   发表时间:2008-11-02  
引用

测试类在那儿?


我那条回复的附件中啊。
0 请登录后投票
   发表时间:2008-11-03  
LZ有人帮你辛苦了,呵呵。所以大伙关心的数据也就看到了!
0 请登录后投票
   发表时间:2008-11-03  
uniseraph, 你的代码的性能差异基本在垃圾收集上, 也就是说, 你设计产生了过多的临时对象, 如果你能改善下, 基本还是跟spymemcached有的一比的, 甚至要超过。因为整个协议的分析,包括写数据都是很简单, 那么临时创建对象的结果就导致性能稍微有点下降, 在多线程下, 差异很容易被放大。
0 请登录后投票
   发表时间:2008-11-03  
uniseraph 写道
今天找了两台服务器进行Memcached Client java的测试,其中
服务器为:
CPU:2* Socket Designation: CPU1  Version: Intel(R) Xeon(R) CPU   E5320  @ 1.86GHz
内存:8G

起8个线程,运行memcached-1.2.6


客户端为:
CPU: 2* Socket Designation: CPU1
        Version: Intel(R) Xeon(R) CPU           E5310  @ 1.60GHz
内存:8G

jdk1.6

代码分支:https://commons-client.googlecode.com/svn/trunk
版本:144


测试多次以后发现,最高达到:66000TPS,基本稳定在61000TPS



刚才发现dev分支最新版本比144版本的性能差25%不知道哪儿改出问题了,呵呵。查一下,然后拿spymemcached做一把对比测试。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics