莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

              趁周末,做了一個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 閱讀(2015) | 評論 (0)編輯 收藏

              成都公交起火事件,死亡24人,剛報道的時候還在各大網站首頁有專題報道,現在卻在首頁上找不到了。一個黨的喉舌見馬克思去了,卻是連續幾天占據著首頁頭條。這人命果真是有高低貴賤。
             另一方面,我發現一個可怕的公式,在這里是
             1人=24人
             在某些人看來,人命價值差距是24倍。那么,6000萬x24=?
            

          posted @ 2009-06-06 19:49 dennis 閱讀(1042) | 評論 (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 閱讀(595) | 評論 (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 閱讀(2200) | 評論 (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 閱讀(1762) | 評論 (0)編輯 收藏

              在博客書城買了一套《新宋》,一共十本,250來塊。其實大部分已經在網上讀過兩遍,除了《燕云》部分未讀完。這是我第一次購買網絡小說,確實非常喜歡《新宋》,比之泛濫的YY三妻四妾的小說,在這個頻繁失語的年代,YY歷史總那么靠譜一點點。
              寫歷史穿越小說,最忌諱的是主角成了萬能博士,技術、工商、文學詩歌樣樣精通,不發明點火藥、火槍,不引用點后人詩歌就白穿越了(邪惡的《尋秦記》里的一滴蜜糖應該是始作俑者)。新宋里面同樣也出現了火藥,但是火藥慶幸不是石越發明的,而是他的學生趙同學,石越只是科普了下最基本的物理化學常識,控制了自己指手畫腳發明一切的愿望,這一點難能可貴。當然,這僅僅是新宋這個YY世界里很小的一部分,更顯然的是阿越在整部小說里闡述了一套政治理想,并近乎可信地描述了這套理想在神宗年間逐步地在實現。
              《新宋》只能叫《新宋》,它發生的年代也似乎注定只能在那個時代,那個天子與士大夫共治天下、政治相對清明的時代,那個神宗力圖富強啟用王安石變法的時代,那個中國古代科學技術又一次達到高峰的時代,那個古文運動末期、宋代理學開始興起的時代,那個相對自信開放又一個航海史上高峰的年代。



          posted @ 2009-05-23 20:42 dennis 閱讀(424) | 評論 (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 閱讀(2928) | 評論 (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 閱讀(3212) | 評論 (2)編輯 收藏

              從廈門來到美麗的杭州,已經三周多。還記的是20號凌晨下的飛機,到了杭州市區,卻找不到酒店入住,原來周末這邊很多人來旅游,都注滿了人。原來預定的酒店,據說集團開什么會,打電話跟我說沒辦法預定了,真是倒霉透了。萬般無奈之下,在麥當勞呆了一個晚上,第二天早上才找到個酒店入住。在酒店住了兩天后,聯系上一個高中的校友,搬過去他的宿舍暫住了兩天,也在這兩天搞定了房子的事情。房子找在了離公司很近的地方,價格便宜,地方很小,考慮到就我孤身一人,能有個地方睡覺就行了。
              公司的氛圍我很適應,沒有那種到陌生地方上班的感覺。暫時沒什么實質性的工作,就是整理文檔,看看源碼,不過上周計劃了下以后的開發工作,在下周培訓后就要開始。趁空閑時間,我花了點時間改進了下xmemcached,也讀了兩三本閑書,技術書倒是一本都沒讀完,似乎暫時不想去碰這類書。部門昨天搬了一個新地方,來之前朋友說的幾個月搬一次是家常便飯的話是真的,離我住的地方又遠了一些,以后要早起10分鐘了,以免遲到。

              說說杭州的印象,其實我在10年前來過一次杭州,那時還是高一上學來旅游的,去了蘇杭、上海,現在除了美麗的導游姐姐外沒剩下多少印象。上個月來杭州面試的時候,因為買的是晚上的機票,恰好有一個下午的時間逛西湖,沿著白堤走,看了看浙江博物館的歷史館,春天的西湖非常美麗,桃花盛開,楊柳依依,游人如織。那時候我在想,如果周末都過來這邊坐坐,那可真不錯,而實際呢,是我來了之后也就一次去過西湖,近了,反而提不起興致了。杭州給我的感覺跟我呆過的幾個地方都不一樣,廣州是活力,廈門是悠閑,杭州如果要用一個詞來形容,那也許是幸福,它不像廣州那樣忙忙碌碌活力四射,又不是廈門那種慢悠悠的生活節奏,而是一種恰到好處的生活,如我見到幾個杭州人,充滿著自信和滿足。杭州街上的女孩,通常都會化妝,可以遠觀,精致的像一幅畫,然而似乎缺少市井生活的氣息,不那么親切,也可能是我自己的感覺作怪。不過見到美女的比例大大提高。杭州話果然是吳儂軟語,但是在某天早上,我卻被一陣機關槍式的吳儂軟語吵醒,原來是小區內的在吵架,吳儂軟語變成了機關槍,真是大煞風景。杭州的小吃,我只嘗過新豐小吃的包子和餛飩,可惜離我住的地方偏遠,不然每天早上吃上那么一籠蝦肉包還真是不錯,吃過一次杭幫菜,對東坡肉念念不忘,下次去吃一定還要點。
              這個月有個RubyConf,報名了,看看有沒有機會去參加。我參會的目的很簡單,聽演講,知道現在大家在關注什么,可能的話認識些人,最后就是能不能順手再賺一件T-shirt。閑話一堆,到此為止,說說愿望,希望能在杭州長期干下去,希望能去紹興看看魯迅故居,希望能磨練自己的心性,更自在地面對困難和問題。

          posted @ 2009-05-10 09:56 dennis 閱讀(719) | 評論 (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 閱讀(1396) | 評論 (2)編輯 收藏

          僅列出標題
          共56頁: First 上一頁 16 17 18 19 20 21 22 23 24 下一頁 Last 
          主站蜘蛛池模板: 伊金霍洛旗| 桂阳县| 西丰县| 南木林县| 达尔| 邵阳县| 井陉县| 奉新县| 清徐县| 章丘市| 年辖:市辖区| 玉环县| 安溪县| 岳池县| 吴川市| 汝阳县| 图们市| 双辽市| 扎赉特旗| 兴安盟| 通道| 广东省| 江源县| 高台县| 襄樊市| 康保县| 从化市| 抚顺市| 清镇市| 军事| 民县| 罗城| 舟山市| 当阳市| 汉沽区| 汉寿县| 绥阳县| 营山县| 红安县| 三门峡市| 西乡县|