qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Strom及DRPC性能測試與改進

          參考1:storm性能測試報告
            參考2:Storm DRPC 使用
            參考3:Storm DRPC 使用及訪問C++ Bolt問題的解決方法
            參考4:Storm 多語言支持之ShellBolt原理及改進
            參考5:Base64編碼及編碼性能測試
            參考6:Base64編碼及編碼性能測試 [改進]
            參考7:zlib使用與性能測試
            參考8:十分簡單的redis使用說明及性能測試
            [參考1]的結(jié)論與局限
            參考種對Storm性能進行測試,得出了以下結(jié)論:
            storm單條流水線的處理能力大約為20000 tupe/s, (每個tuple大小為1000字節(jié))
            storm系統(tǒng)本省的處理延遲為毫秒級
            在集群中橫向擴展可以增加系統(tǒng)的處理能力,實測結(jié)果為1.6倍
            Storm中大量的使用了線程,即使單條處理流水線的系統(tǒng),也有十幾個線程在同時運行,所以幾乎所有的16個CPU都在運行狀態(tài),load average 約為 3.5
            Jvm GC一般情況下對系統(tǒng)性能影響有限,但是內(nèi)存緊張時,GC會成為系統(tǒng)性能的瓶頸
            使用外部處理程序性能下降明顯,所以在高性能要求下,盡量使用storm內(nèi)建的處理模式
            作者對strom的處理能力和可擴展性進行了測試,給出了很有說服力的數(shù)據(jù)。但還不能滿足我們的需要:
            1)由于作者使用的tuple為1000字節(jié),也就是1K,數(shù)據(jù)量相對較小,而在實際使用過程中,storm作為實時流處理系統(tǒng),處理的數(shù)據(jù)可能比較大。比如我們用來進行圖像處理,一個圖片可能有1M左右。這時候storm的性能如何呢?
            2)為了簡化storm的集成,我們使用DRPC來訪問storm,具體用法可參見[參考2]和[參考3],在DRPC訪問時,數(shù)據(jù)需要從DRPCClient發(fā)送至DRPCServer,再由DRPCServer發(fā)送給topology中的spout,spoout發(fā)送給Bolt........;當數(shù)據(jù)處理完畢后,還要由Bolt返回給DPRCServer,由DRPCServer返回給DRPCClient。
            增加了這些步驟以后,Strom DRPC的性能究竟如何呢?
            3)作者在[參考1]中提到,使用外部處理程序時Storm的性能明顯下降,大概只有1/10的性能。但是我們在實際使用中,可能經(jīng)常是在已有的基礎上,將功能集成到Storm中運行。通俗點說:實際情況是我們經(jīng)常使用外部處理程序,這種情況下,怎么能提高Storm的性能呢?關于這點可以查看[參考4]。我們使用JNI來解決。
            測試與結(jié)論
            1)測試環(huán)境
            測試環(huán)境如圖所示
            有客戶端和兩臺服務器組成。
            客戶端為虛擬機,單核3.2GHz  1G 內(nèi)存,100M帶寬。
            服務器也是虛擬機,8核2.2GHz,8G內(nèi)存,1G帶寬。
            DRPC Topology由一個DRPCSpout,CPPBolt和一個ReturnResult組成。功能是接收一個字符串并返回。
            Topology運行在一個work中,Spout,Bolt分別由不同的線程執(zhí)行。
           2)測試方法
            在Client啟動0-100多個線程,不停的訪問Topology,向其發(fā)送一個字符串(1K-1M)。Topology會原封不動的返回該字符串。
            測試過程就不詳細展開了。直接說測試結(jié)果。
            3)測試結(jié)論
            該測試中,處理速度主要受限于客戶端帶寬。也就是說由于數(shù)據(jù)量大,客戶端發(fā)的速度慢,低于Storm中topology的處理速度。
            因此該測試只能得出DRPC方式中單個請求在不同數(shù)據(jù)大小時,storm的延遲時間。
            簡而言之,StormDRPC方式中,最小延遲為50ms(數(shù)據(jù)小于1K),當數(shù)據(jù)量大時,256K數(shù)據(jù),延遲為125ms,512K時延遲為208ms。
            所以Storm數(shù)據(jù)量較大的時,處理的延遲還是比較大的。
            當然以上僅是在特定環(huán)境中的測試,僅供參考。
            改進方法
            根據(jù)個人經(jīng)驗,針對以上Storm延遲可以由以下改進方法:
            1)數(shù)據(jù)可以先壓縮后再交給storm處理,在具體的bolt中對其進行解壓縮。根據(jù)個人測試zlib壓縮1M的數(shù)據(jù),壓縮率為80%,既可以將數(shù)據(jù)研所為原來的20%。從而可以減小數(shù)據(jù)量,提高效率。而zlib對1M數(shù)據(jù)進行壓縮、解壓縮所用時間在10ms以內(nèi)??梢允骨闆r選用。見[參考7]
            2)storm本身采用字符型傳輸,對于二進制數(shù)據(jù)必須進行編碼。可采用base64編碼。參見[參考5],base64對1M數(shù)據(jù)的編碼,解碼時間也分別小于10ms。
            3)在DRPC測試中,數(shù)據(jù)從Clinet到DRPCServer,到DRPC SPOUT,到BOLT,到RETURN Result,在到DRPCSERVER,最后返回Client傳輸多次,可以考慮使用內(nèi)存數(shù)據(jù)庫如redis,Client直接將數(shù)據(jù)放入redis,將其在redis中的路徑進行傳輸,在需要時,由bolt從redis中獲取。參見[參考8]。將1M數(shù)據(jù)在redis中存取,耗時也分別在10-20ms。
            4)對于外部處理程序,如C++,可以采用JNI的方式,對ShellBolt進行改進,而不是啟動新的進程在通過Json編碼,Pipe傳輸與之通訊,從而也可以提交效率。參見[參考4]。

          posted on 2014-12-08 20:40 順其自然EVO 閱讀(296) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 汶川县| 嘉善县| 巴马| 诸暨市| 长白| 沙雅县| 镇沅| 江永县| 潜江市| 台湾省| 万盛区| 定西市| 丽江市| 大姚县| 伊宁市| 静海县| 衡水市| 彭泽县| 抚顺县| 金秀| 惠来县| 百色市| 那坡县| 灯塔市| 二连浩特市| 江达县| 汶上县| 兴城市| 兴仁县| 德清县| 霍城县| 沂源县| 特克斯县| 黄陵县| 赤城县| 尉氏县| 大新县| 璧山县| 砚山县| 白玉县| 花垣县|