庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

    趁周末,做了一个java memcached client的性能benchmark,比较了4个开源的client: spymemcachehd,xmemcached,java-MemCached和岑文初的asf-cached。这个测试可能不是那么准确,为了保证命中率,无法测试更多并发下的表现,以后再测试多个memcached server下的表现可能更有价值。详细的测试报告在这里 http://xmemcached.googlecode.com/svn/trunk/benchmark/benchmark.html,包括了测试场景、结果、软硬件情况说明等等。从测试分析产生的报表来看,在低并发下,基于传统的阻塞io的clients表现还可以,经过岑文初优化的版本超过了原始的java-MemCached。而在并发相对高一点的情况下,基于nio的spymemcached和xmemcached都超过了传统clients,不过这个差距随着value大小的增大而减小。另外,xmemcached在value比较小(小于1K左右)的性能高于spymemcached,而在更大value的情况下却是比不上spymemcached,不过这个差距随着并发增大而减小。更多信息请自己查看报告,checkout源码来分析。

    xmemcached正式发布1.1.1,这个版本可以说是更强壮,更稳定的版本,也是支持二进制协议前的过渡版本。主要的改进如下:

1、yanf4j从0.60升级到0.61,因此使用的时候请替换这个jar包。
2、更多的单元测试,单元测试覆盖率达到63%,并覆盖了绝大多数关键代码。
3、进行了24小时压测,观察内存使用情况等,未发现有内存泄漏的隐患。
4、最重要的重构,将原来基于switch语句的协议解析部分修改为了更为OO的Command继承体系,尽管因为多态调用带来一点性能损失,然而整体结构更加合理,并易于添加新的协议支持和扩展(比如binary协议)。性能将会持续在后续版本进行改进。
5、修复BUG和添加新特性,并deprecated部分方法和类,具体信息参考Changelog


   项目首页:    http://code.google.com/p/xmemcached/
   javadoc文档: http://xmemcached.googlecode.com/svn/trunk/apidocs/index.html
   下载地址:     http://code.google.com/p/xmemcached/downloads/list
   wiki地址:     http://code.google.com/p/xmemcached/w/list
   svn地址:     http://xmemcached.googlecode.com/svn/trunk/
   

posted @ 2009-06-07 23:37 dennis 阅读(2011) | 评论 (0)编辑 收藏

    成都公交起火事件,死亡24人,刚报道的时候还在各大网站首页有专题报道,现在却在首页上找不到了。一个党的喉舌见马克思去了,却是连续几天占据着首页头条。这人命果真是有高低贵贱。
   另一方面,我发现一个可怕的公式,在这里是
   1人=24人
   在某些人看来,人命价值差距是24倍。那么,6000万x24=?
  

posted @ 2009-06-06 19:49 dennis 阅读(1007) | 评论 (1)编辑 收藏

    端午回了一趟家,儿子一个月一个模样,现在会翻身和抓东西了,带来的后果是有一次翻身不小心掉下了床,摔的哇哇大哭,幸好没什么事,另外就是抓到什么东西都往嘴里塞。俺知道他现在只能靠手和嘴来感受世界,已经不阻止他吃手了,但是什么东西都往嘴里塞那还得了。本来以为一个月没见,儿子会对我比较生疏,没想到还是很喜欢我呀,哈哈,常常“深情”地看着俺写代码,心里那个美。

    端午到现在,另一个比较重要的进展是xmemcached 1.11基本完成了,这个版本在添加了大量单元测试的基础上重构了一大批代码,单元测试的覆盖率达到60%了,整体的结构也比较理想,从过程式的switch派发修改成了更为OO的继承结构,为1.20引入binary协议做了好准备。最近都趁晚上在公司做压测和benchmark测试,搞了一个更为严谨的benchmark测试,计划这周日能正式发布1.11版本了。

    工作上,暂时只是小打小闹,做些小的改动和测试,不过下周开始要投入新版本的开发工作和一些绩效需要的工作,因此对于xmemcached投入将减少,初步计划是在7月份发布1.20版本支持二进制协议和noreply选项。

    读书的话,sicp的第五章最近快读完了,读完了将练习整理下再发到这里。而其他书基本没碰,《新宋》倒是一下子看完了,果然是小说读的爽快,技术书读的又苦又累。最近天天晚上睡不着,也许是太热了,睡眠不足的后果就是白天昏沉沉的,写代码的时候却又精神抖擞,所以标题取作累并快乐着。晚了,希望能睡着。
   

   





posted @ 2009-06-04 00:43 dennis 阅读(591) | 评论 (1)编辑 收藏


    最近遇到一个选择题,在xmemcached中,get方法原来的签名是这样的:
public Object  get(final String key) throws TimeoutException,InterruptedException,MemcachedException;
    那么用户使用的时候,需要自己转型,也就是这样

String value=(String)client.get("key");

    后来我将get方法的签名改成了泛型方法,xmemcached帮你做这个转型工作,
public <T> T get(final String key) throws TimeoutException,InterruptedException, MemcachedException;

    方法的实现因为有了个转型,不得不加上抑制警告,
    @SuppressWarnings("unchecked")
    
public final <T> T get(final String key) throws TimeoutException,
            InterruptedException, MemcachedException {
        
return (T) get(key, DEFAULT_OP_TIMEOUT);
    }
    这样用户使用的时候,就不需要显式转型,而是xmemcached帮你做了,
String value=client.get("key");
    后来,我仔细想了这个问题,尽管这里使用了泛型方法,似乎简化了用户的工作,然而却丢掉了编译警告,抑制警告让用户可能忽略这里可能的转型失败,这与泛型的初衷似乎不符。可是,另一个观点冒出来支持我,用户往memcached存进去一头大象,他(她)不会希望取出来的时候变成驴子,我们帮他做这个转型工作可以让用户使用起来更简便。你怎么看呢?
    
     

posted @ 2009-05-24 20:05 dennis 阅读(2193) | 评论 (5)编辑 收藏

    Ruby中的Object.object_id是返回一个Fixnum类型的标识符来代表一个对象。没有两个active的对象的object_id是一样的,如:
a="1.8.6"
b
="1.8.6"
a.object_id  
=> 24393910
b.object_id  
=> 24390830
    尽管a==b,然而两者的object_id是不同。
    但是这里有两种例外情况,对于常量,哪怕你将它赋给不同的变量,它们的object_id是一样的:

a=RUBY_VERSION
b
=RUBY_VERSION
a.object_id  
=> 21628310
b.object_id  
=> 21628310

C="hello" 
a=C 
b=C 
a.object_id =>  24243480 
b.object_id =>  24243480 
   
    除此之外,对于symbol类型,返回的也将是同一个object_id:

a=:name
b
=:name
a.object_id 
=> 34258
b.object_id 
=> 34258
   
    为什么会出现这种情况?查看源码可知:
VALUE
rb_obj_id(VALUE obj)
{
 
   
if (TYPE(obj) == T_SYMBOL) {
       
return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
   }
   
if (SPECIAL_CONST_P(obj)) {
       
return LONG2NUM((long)obj);
   }
   
return (VALUE)((long)obj|FIXNUM_FLAG);
}
    Object.object_id方法对这两种情况做了特殊处理,常量和symbol都应当是唯一的。

posted @ 2009-05-24 12:46 dennis 阅读(1751) | 评论 (0)编辑 收藏

    在博客书城买了一套《新宋》,一共十本,250来块。其实大部分已经在网上读过两遍,除了《燕云》部分未读完。这是我第一次购买网络小说,确实非常喜欢《新宋》,比之泛滥的YY三妻四妾的小说,在这个频繁失语的年代,YY历史总那么靠谱一点点。
    写历史穿越小说,最忌讳的是主角成了万能博士,技术、工商、文学诗歌样样精通,不发明点火药、火枪,不引用点后人诗歌就白穿越了(邪恶的《寻秦记》里的一滴蜜糖应该是始作俑者)。新宋里面同样也出现了火药,但是火药庆幸不是石越发明的,而是他的学生赵同学,石越只是科普了下最基本的物理化学常识,控制了自己指手画脚发明一切的愿望,这一点难能可贵。当然,这仅仅是新宋这个YY世界里很小的一部分,更显然的是阿越在整部小说里阐述了一套政治理想,并近乎可信地描述了这套理想在神宗年间逐步地在实现。
    《新宋》只能叫《新宋》,它发生的年代也似乎注定只能在那个时代,那个天子与士大夫共治天下、政治相对清明的时代,那个神宗力图富强启用王安石变法的时代,那个中国古代科学技术又一次达到高峰的时代,那个古文运动末期、宋代理学开始兴起的时代,那个相对自信开放又一个航海史上高峰的年代。



posted @ 2009-05-23 20:42 dennis 阅读(416) | 评论 (0)编辑 收藏


    相比于RC3版本,做出的主要改进是:
1、改进批量get操作(multi-gets)的性能,现在已经与spymemcached相近。额外的益处是进一步在get操作上扩大了对spymemcached的领先优势。
2、做了两个重构:
a)将MemcachedTCPSession、MemcachedHandler、MemcachedConnector等网络相关的类和接口从net.rubyeye.xmemcached转移到net.rubyeye.xmemcached.impl包。

b)引入两个新的接口: MemcachedClient,MemcachedClientBuilder

3、更多单元测试

4、将xmemcached 1.10从trunk转移到分支branches/xmemcached-1.10。Trunk将做1.2版本的开发,实现二进制协议。

到目前为止,xmemcached的特性一览
1、高性能
2、支持完整的memcached文本协议,二进制协议将在1.2版本实现。
3、支持JMX,可以通过MBean调整性能参数、动态添加/移除server、查看统计等。
4、支持客户端统计
5、支持memcached节点的动态增减。
6、支持memcached分布:余数分布和一致性哈希分布。
7、更多的性能调整选项。

xmemcached与spymemcached的对比

1、xmemcached比spymemcached有更好的性能表现,在get、set、delete、multi-gets等操作的测试中都远远超过或者接近spymemcached。
   xmemcached在win32和linux两个平台上都有极佳的性能表现。
2、xmemcached支持动态地添加或者移除memcached server,可以通过编程或者JMX来做到,spymemcached暂未支持。
3、xmemcached支持JMX,可以通过jmx调整性能参数、添加/移除memcached节点、查看统计,spymemcached暂未支持
4、xmemcached有客户端统计,可以统计xmemcached客户端的各种操作的总次数,spymemcached暂未支持
5、xmemcached允许调整更多的网络层参数和优化选项,spymemcached不允许设置这些参数。
6、xmemcached暂未支持二进制协议,计划在1.2版本中实现,spymemcached支持。
7、xmemcached的API模型是同步的,而spymemcached的API模型是异步模型,同步模型对应用编程来说更容易使用和直观。

8、xmemcached的序列化机制,是使用了spymemcached的序列化机制,并做了部分改造。

 项目主页:http://code.google.com/p/xmemcached/

 下载地址:http://code.google.com/p/xmemcached/downloads/list

 wiki地址:http://code.google.com/p/xmemcached/w/list

   讨论组:http://groups.google.com/group/xmemcached

     协议: Apache License 2.0

  svn地址:http://xmemcached.googlecode.com/svn/branches/xmemcached-1.10/

 

欢迎任何建议和bug报告。



posted @ 2009-05-22 18:42 dennis 阅读(2915) | 评论 (1)编辑 收藏

    String.split方法很常用,用于切割字符串,split传入的参数是正则表达式,它的内部是每次都comiple正则表达式,再调用Pattern.split方法:
public String[] split(String regex, int limit) {
    
return Pattern.compile(regex).split(this, limit);
    }

  
public String[] split(String regex) {
        
return split(regex, 0);
    }

    因此,如果你调用String.split非常频繁的话,每次都重新编译正则表达式的代价很高,性能会受到很大影响,此时最好自己预编译Pattern,再调用Pattern.split方法为妙。
String []items=line.split(" ");

//替代为

static Pattern pattern=Pattern.compile(" ");



String []items
=pattern.split(line,0);


PS.今天支付宝的蔡学镛大师到公司演讲,做的是《关于我的IT学习生活》的主题讲座,介绍了他的经历和经验,留下深刻印象的是他看起来很年轻,和照片相差比较大,并且上过3所大学,呆过两家同一个人开的公司并都倒闭了,非常有趣的经历。







posted @ 2009-05-21 22:49 dennis 阅读(3206) | 评论 (2)编辑 收藏

    从厦门来到美丽的杭州,已经三周多。还记的是20号凌晨下的飞机,到了杭州市区,却找不到酒店入住,原来周末这边很多人来旅游,都注满了人。原来预定的酒店,据说集团开什么会,打电话跟我说没办法预定了,真是倒霉透了。万般无奈之下,在麦当劳呆了一个晚上,第二天早上才找到个酒店入住。在酒店住了两天后,联系上一个高中的校友,搬过去他的宿舍暂住了两天,也在这两天搞定了房子的事情。房子找在了离公司很近的地方,价格便宜,地方很小,考虑到就我孤身一人,能有个地方睡觉就行了。
    公司的氛围我很适应,没有那种到陌生地方上班的感觉。暂时没什么实质性的工作,就是整理文档,看看源码,不过上周计划了下以后的开发工作,在下周培训后就要开始。趁空闲时间,我花了点时间改进了下xmemcached,也读了两三本闲书,技术书倒是一本都没读完,似乎暂时不想去碰这类书。部门昨天搬了一个新地方,来之前朋友说的几个月搬一次是家常便饭的话是真的,离我住的地方又远了一些,以后要早起10分钟了,以免迟到。

    说说杭州的印象,其实我在10年前来过一次杭州,那时还是高一上学来旅游的,去了苏杭、上海,现在除了美丽的导游姐姐外没剩下多少印象。上个月来杭州面试的时候,因为买的是晚上的机票,恰好有一个下午的时间逛西湖,沿着白堤走,看了看浙江博物馆的历史馆,春天的西湖非常美丽,桃花盛开,杨柳依依,游人如织。那时候我在想,如果周末都过来这边坐坐,那可真不错,而实际呢,是我来了之后也就一次去过西湖,近了,反而提不起兴致了。杭州给我的感觉跟我呆过的几个地方都不一样,广州是活力,厦门是悠闲,杭州如果要用一个词来形容,那也许是幸福,它不像广州那样忙忙碌碌活力四射,又不是厦门那种慢悠悠的生活节奏,而是一种恰到好处的生活,如我见到几个杭州人,充满着自信和满足。杭州街上的女孩,通常都会化妆,可以远观,精致的像一幅画,然而似乎缺少市井生活的气息,不那么亲切,也可能是我自己的感觉作怪。不过见到美女的比例大大提高。杭州话果然是吴侬软语,但是在某天早上,我却被一阵机关枪式的吴侬软语吵醒,原来是小区内的在吵架,吴侬软语变成了机关枪,真是大煞风景。杭州的小吃,我只尝过新丰小吃的包子和馄饨,可惜离我住的地方偏远,不然每天早上吃上那么一笼虾肉包还真是不错,吃过一次杭帮菜,对东坡肉念念不忘,下次去吃一定还要点。
    这个月有个RubyConf,报名了,看看有没有机会去参加。我参会的目的很简单,听演讲,知道现在大家在关注什么,可能的话认识些人,最后就是能不能顺手再赚一件T-shirt。闲话一堆,到此为止,说说愿望,希望能在杭州长期干下去,希望能去绍兴看看鲁迅故居,希望能磨练自己的心性,更自在地面对困难和问题。

posted @ 2009-05-10 09:56 dennis 阅读(710) | 评论 (5)编辑 收藏

    在某用户(可能是唯一用户)的反馈和建议下,xmemcached做了不少改进和修正,特此感谢。
    XMemcached发布1.10-RC3,这可能是1.10 release前最后一个RC版本,此版本的主要改进:

1、引入XMemcachedClientMBean接口,添加一个新的MBean,主要功能是允许通过JMX动态添加或者移除memcached server。如图:



除了通过JMX之外,也可以通过编程来动态添加或者移除memcachd server节点。例如:

XMemcachedClient client
//添加server
client.addServer("192.168.111.222:11211 192.168.111.221:11211");
//移除
client.removeServer("192.168.111.222:11211 192.168.111.221:11211");


2、引入新的cas重载方法,允许用户自主传入GetsResponse(gets协议的返回结果),而不需要xmemcached去自动获取首次gets结果。

<T> boolean
    cas(java.lang.String key, GetsResponse
<T> getsReponse, CASOperation<T> operation) 

<T> boolean
    cas(java.lang.String key, GetsResponse
<T> getsReponse, CASOperation<T> operation)

3、重构和修改bug等,重命名transcoder包防止与spymemcached冲突,更多单元测试和相应重构。

4、附带最新的测试结果
测试环境:
服务端:memcached server跑在4核,4G内存的linux机器上,linux内核是2.6.9-55。 memcached启动参数:memcached -p 12000 -m 2048 -d

客户端:跑在8核,16G内存的linux机器上,内核是2.6.9-67。xmemcached版本是1.10-RC3,spymemcached的版本是2.3.1,两者都是默认配置。

测试用例:  key和value都是100个字节的字符串,启动N个线程并发地操作同一个memcached client,进行set、get、delete操作,各操作总次数均在100万次以上,最后统计TPS。

具体结果请看下面








结果说明:

图片采用jfreechart生成,spymemcached在100个并发及以上,get操作无法设置超时时间导致抛出很多超时异常,因此无法给出有价值的数据。

下载地址在这里

posted @ 2009-05-09 15:42 dennis 阅读(1389) | 评论 (2)编辑 收藏

仅列出标题
共56页: First 上一页 16 17 18 19 20 21 22 23 24 下一页 Last