放翁(文初)的一畝三分地

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            210 隨筆 :: 1 文章 :: 320 評論 :: 0 Trackbacks
           

          Author:放翁(文初)

          Date: 2010/4/14

          Email:fangweng@taobao.com

          圍脖: http://t.sina.com.cn/fangweng

          這部分是結果,大家可以當看倒序的電影,后續會有前篇給出。

          Web服務異步化

                   包括兩部分,數據傳輸層異步化(大家已經熟知的NIO),Http業務請求異步化(continuationsservlet3.0)。服務異步處理我將會有一個詳細的說明文檔(服務異步化的概念,服務異步化的幾種標準實現,服務異步化容器的特點),后續給出。

          Web服務異步化測試原因

                   TOP應用特殊性:

          1.自身服務能力由后端的服務能力決定。(對同步Web請求的轉發)

          2.后端服務部署等同性,但要求服務互不影響。

          第一點導致TOP無法預估自身服務能力(不同后端服務處理速度下的TOP有不一樣的支持能力),同時也無法應對在后端服務異常的情況下,整體的服務質量。

          第二點導致TOP只有在物理上分隔不同服務提供者所對應的TOP集群(資源浪費,同時無法動態調整資源來滿足服務變化情況)。

                   因此需要對TOP實施web服務異步處理的測試。這里簡單的說一下服務異步化的使用場景需要滿足的幾個特點:

          1.       處理耗時大多消耗在于對后端或者外部服務資源的請求上。

          2.       后端或者外部資源在更多的流量下不會成為瓶頸。

          TOP來解釋一下:TOP自身處理主要包括路由,安全,流控等,但是最耗時的是在請求后端各個淘寶團隊的服務。其次當前后端服務能力尚未達到真實的處理高峰,因此很多請求被堵在TOP平臺,特別是當某些服務異常的時候,另一些服務就會被拖累無法得到充分利用。(當然我們有流控,發現后端服務能力已經成為瓶頸的時候可以對單獨服務作限制)。

          長話短說,上測試結果……

          環境說明

          Linux 2.6.9-55.ELsmp

          4 Core

          4 G Memory

          JDK 1.6.0_07

          測試工具:loadRunner 9.5

          測試涉及到了四種容器部署:后面都會用縮寫在測試結果上注明

          1.       Apache + modjk + Jboss(后面縮寫為Jboss)

          此模式Apache配置如下:

          <IfModule mpm_worker_module>

          ServerLimit          80

          ThreadLimit          128

          StartServers         10

          MaxClients           10240

          MinSpareThreads      64

          MaxSpareThreads      800

          ThreadsPerChild      128

          MaxRequestsPerChild 10000

          </IfModule>

             Jbossweb容器配置如下:

          <Connector port="8009" address="${jboss.bind.address}" connectionTimeout="8000" protocol="AJP/1.3" maxThreads="500" minSpareThreads="40" maxSpareThreads="75" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" URIEncoding="utf-8"/>

          Jbossweb部分以APR模式啟動。

          2.       Tomcat6APR

          關鍵配置如下:

          <Executor name="topThreadPool" namePrefix="top-exec-"

                  maxThreads="500" minSpareThreads="40"/>

              <Connector port="7777" protocol="HTTP/1.1"

                         executor="topThreadPool" connectionTimeout="20000" acceptCount="1000"

                         redirectPort="8444" />

          3.       Tomcat7 RC 4APR

          關鍵配置如下:

              <Executor name="topThreadPool" namePrefix="top-exec-"

                  maxThreads="500" minSpareThreads="4"/>

              <Connector executor="topThreadPool" port="3333" protocol="HTTP/1.1"

                         connectionTimeout="20000" acceptCount="1000"

                         redirectPort="6443" />

          4.       Jetty7

          關鍵配置如下:

          <Set name="ThreadPool">

                <!-- Default queued blocking threadpool -->

                <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">

                  <Set name="minThreads">10</Set>

                  <Set name="maxThreads">500</Set>

              </Set>

              <Call name="addConnector">

                <Arg>

                    <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">

                      <Set name="host"><SystemProperty name="jetty.host" /></Set>

                      <Set name="port"><SystemProperty name="jetty.port" default="6060"/></Set>

                      <Set name="maxIdleTime">300000</Set>

                      <Set name="Acceptors">2</Set>

                      <Set name="statsOn">false</Set>

                      <Set name="confidentialPort">8443</Set>

                      <Set name="lowResourcesConnections">20000</Set>

                      <Set name="lowResourcesMaxIdleTime">5000</Set>

                    </New>

                </Arg>

              </Call>

          附注:

          Asyn表示異步模式,syn表示同步。Asyn中還分成resumecomplete兩種方式,后續在介紹技術背景的時候詳細描述。

                   對于服務端的load不是每一個測試都做了記錄,選取了最全面的1500并發用戶做了測試。

                   最大服務請求處理數是通過應用自身實現,具體代碼可以參考后面的代碼附件。

          測試結果如下:

          場景1500 并發用戶場景下,后端服務一次請求消耗3秒鐘

          容器

          模式

          TPS

          Average Response Time(s)

          Average Throughput(byte/s)

          最大請求處理數

          Success rate

          Jetty7

          asyn(resume)

          162.8

          3.008

          38430

          500

          100%

          Tomcat6

          syn

          163.3

          3.005

          18453

          500

          100%

          這個場景測試的目的是比較在線程池資源足夠的時候,異步和同步的差別。(也就是TOP服務器所有的資源處于正常服務,前臺請求沒有因為前段連接被消耗完,導致服務質量降低)

                   可以看到,在TPSResponse Time上兩者基本上沒有太大差別,TPS就等于500/3=167左右(3秒一個請求,因此用這種簡單算式可以算出),響應時間也較為正常。當時我發現在每秒吞吐量上有些差別,后來單個測試case跑了一下,發現是返回的http header比較大,應該是在做異步化時重入等作的一些標識(后面其他容器的異步化也是一樣)。

                   最大處理請求數都在服務端后臺看到是500,等同于最大的并發用戶數。

          場景21000 并發用戶場景下,后端服務一次請求消耗3秒鐘

          容器

          模式

          TPS

          Average Response Time(s)

          Average Throughput(byte/s)

          最大請求處理數

          Success rate

          Jetty7

          asyn(resume)

          317.06

          3.036

          74826

          1000

          100%

          Tomcat6

          syn

          163.323

          5.904

          18455

          500

          100%

                   場景2就在資源不足的情況下,比較異步服務請求與同步請求處理能力。(例如由于后端某些服務比較慢,導致前段的服務器能夠承載的請求數目超過了線程數)

                   這個場景的結果可以看到TPS在異步模式下與并發用戶數呈現同步增長,就好比配置了1000個線程作為線程池一樣,同樣在后端打出的最大請求數上也證明了這一點,因此前段線程池的服務能力在異步的情況下充分復用(當然這里使用的異步服務處理使用的是NIO而不是BIOConnector)。同樣在吞吐量上依然是增加的,由于異步附加的內容。

          場景31500 并發用戶場景下,后端服務一次請求消耗3秒鐘

          容器

          模式

          TPS

          Average Response Time(s)

          Average Throughput(byte/s)

          Server Load

          Success rate

          Jboss

          syn

          75.546

          5.347

          21002

          0.115

          68%

          Jetty7

          Syn

          163.156

          8.788

          19252

          0.129

          100%

          Jetty7

          Asyn(complete)

          432.153

          3.312

          76491

          2.649

          100%

          Jetty7

          Asyn(resume)

          423.638

          3.375

          99979

          2.826

          100%

          Tomcat6

          Syn

          163.836

          8.75

          18513

          0.258

          100%

          Tomcat7

          ASyn

          423.501

          3.328

          54632

          1.064

          99.3%

          場景三比對了現有TOP的部署模式(Apache + modjk + Jboss)和Jetty7的同步模式,兩種異步模式,Tomcat同步模式,Tomcatservlet3.0異步模式的處理情況。根據測試可以得到的信息如下:

          1.              現有部署方式在后端服務處理耗時較大的情況下,處理能力不如Jetty7Tomcat6,同時出錯率很高。

          2.              Jetty7的同步處理測試結果和Tomcat6的同步處理測試結果很類似,但是load方面jetty7更好。

          3.              異步處理方面Jetty7的兩種方式基本上差別不大(后續還需要深入源碼看看對于數據緩存資源復用的狀況),Tomcat7的異步處理成功率有些問題(錯誤多半是在獲取response回寫的時候,response已經被提前釋放,看來Tomcat7還是需要一些時間來考驗),load上來說tomcat結果比較好。

          4.              異步請求在提高處理能力的情況下,對于資源消耗也較大(線程切換較為頻繁),不過還是在承受范圍。

          三個場景組合比較:

          容器

          并發用戶

          模式

          TPS

          Average Response Time(s)

          Average Throughput(byte/s)

          Success rate

          Jetty7

          500

          asyn(resume)

          162.8

          3.008

          38430

          100%

          Jetty7

          1000

          asyn(resume)

          317.06

          3.036

          74826

          100%

          Jetty7

          1500

          asyn(resume)

          423.638

          3.375

          99979

          100%

          Tomcat6

          500

          syn

          163.3

          3.005

          18453

          100%

          Tomcat6

          1000

          syn

          163.323

          5.904

          18455

          100%

          Tomcat6

          1500

          Syn

          163.836

          8.75

          18513

          100%

          最后將三個場景合并起來做一個簡單的比較,得到信息如下:

          1.       隨著并發用戶的增加,本身異步處理也會有衰減,同時對于性能消耗(線程切換)也會不斷增長。

          2.       異步化在消息頭上會增加一些數據,會增加回寫的帶寬消耗(不過量不大),一個請求增加了100byte左右的消息數據。

          測試總結:

          1.       Web請求異步化在TOP很合適。

          重復兩個條件:

          a.       處理耗時大多消耗在于對后端或者外部服務資源的請求上。

          b.       后端或者外部資源在更多的流量下不會成為瓶頸。

          2.       Web請求異步化在Jetty67上已經經歷了2年多的成長(Google App Engine , Yahoo Hadoop),穩定性和效率較好。(同時很多優化可以通過擴展自行定制,jetty的可擴展性很好Tomcat7servlet3上處于剛發布階段,還有待繼續完善。(Servlet3的另一種模式尚未執行成功,直接導致jvm退出)

          后續需要繼續跟進的:

          1.       對于大數據量請求的容器間性能對比。(圖片上傳或者大數據量的Post請求)

          2.       容器安全性。(是否容易被攻擊)

          3.       代碼遷移成本。

          后續篇涉及:服務異步化的概念,服務異步化的幾種標準實現,服務異步化容器的特點和實現,現有容器可優化的點。

           打個廣告:http://blog.open.taobao.com/archives/1417 TOP需要人才加入

          posted on 2010-06-13 14:35 岑文初 閱讀(4430) 評論(9)  編輯  收藏

          評論

          # re: Web服務請求異步化測試 2010-06-13 15:30 melin
          期待后續的文章......  回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-22 17:53 孔夫子
          作者的博客好多文章,估計要看很久。
          我也說幾句吧,呵呵,免費看了你這么多文章,估計你寫的也挺辛苦的。
          其實技術,現在在web這一塊,基本上都沒有技術含量,當然java也不例外。
          技術不應該是重點,應用才是重點。
          技術需要的就是使用,多用用就會了,當然多花些時間也是要的。呵呵,我覺得技術最重要的是創新,但可惜創新很難哦。
          技術人員很喜歡陶醉在技術里面,其實說真的,真的沒有什么東西好鉆研的。需要鉆研的其實是技術以外的東西??上Ш芏嗳硕甲呋鹑肽?,九陰真經倒著練。
          其實我要表達的觀點是技術不難,難在創新而已。技術人員關心的不應該在技術本身上。
          完了,這就是我的觀點,呵呵,肯定很多人會反對我的觀點。
          多花些時間在別的上面吧,花在哪都比花在技術上好啊




            回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-23 10:41 岑文初
          @孔夫子
          首先技術的目標就是服務客戶,這就是最更本的要求,否則就是一個沒有畢業的大學生,因此我所涉及的內容不會為了技術而技術,是產品需要而生。其次,這年頭一堆人搞忽悠,沒有人踏踏實實的寫點代碼,基本不靠譜,同時創新不是腦袋里蹦出來的,而是在使用前人已有的技術時發現無法滿足需求才去思索和實踐得到的結果,整天想著創新卻不踏踏實實的干點事情,那就是等著天上掉餡餅,呵呵,不多說,仁者見仁,智者見智,少一些抱怨,多一些實干,把平凡的事情做的不平凡那就夠了  回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-23 11:57 孔夫子
          @岑文初
          仁兄還是沒理解我的話,我不是說不要技術,而是說不要因此走火入魔,舍本求末,我本人曾經看過一個幾千萬的項目栽在一個浙大技術狂徒手上而一文不值,對設計模式,對代碼規范本身,對架構,這些都不要太過,我見過一個年輕人為了一個設計一個向導,從設計模式,從通用性,從耦合度,甚至從架構上考慮,我當時對他說你走火入魔了,九陰真經倒著練,可惜對走火的人這種話是聽不進去的,過猶不及。
          我以為真正的高手,眼里是沒有技術,沒有語言的,只有流程、規范、標準、業務,用戶需求,這或許就是無招勝有招吧。
          我本人可以左右的項目,我是堅決不用spring,hibernate,struts,jquery這些的,更別說更花哨的,因為我不想舍本求末  回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-23 12:12 岑文初
          @孔夫子
          這么說我同意,呵呵,學形,學意或者悟道都是不斷進步的,這也是我們這些老家伙為什么會比新人值錢的原因,如果僅僅關注技術外在那么做個五年還就是一個熟練工  回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-24 00:32 一意孤行
          @岑文初
          關于老家伙為什么比新人值錢,我曾經跟我老板有過對話。我說你一個月給我2w,是否有考慮過招2個1w的,或者是4個5千的,或者是5個4千的。我老板的回答是我肯定還是要你,甚至我可以還可以給你更多。因為你寫的代碼我放心,我不能讓那些新人來我這里練兵,bug一大堆,那還賺什么錢,再說了最后你讓他們寫,最后你發覺還是還是要你自己寫。
          這是老板的考慮,我覺得很貼切。其實bug才是值錢的因素。沒有那么多其他的原因。
          其實我不喜歡blogjava,這里面技術太濃了,光怎么用struts,hibernate,spring,還有一些稀奇古怪的技術框架一大堆,這是舍本求末的。
          我提到過taobao api must die,可能很殘忍,但是其實這并不是一件不好的事情,任何一家要成為偉大公司的,沒有經歷過這或那的失敗也是不可能的。
          只是真的很不希望這么多人陷在技術的泥潭里而不能自拔。青春雖然是用來揮霍的,但揮霍在這些上真的不值得。
          其實現在很少跟人這么交流了,只是看到仁兄這么好的才華,惺惺相惜,擔心對于技術太過于癡迷,畢竟這樣的人我見了不少。
          我本來在blogjava里面也有幾篇文章的,后面也都刪了,總有點擔心誤人子弟。






            回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-24 00:47 一意孤行
          想來這些年,java,c++,js,php,flash都玩過,數據庫更是玩了一遍,但我從不鉆研,都是用前先看,用后就扔的原則,所以我很不喜歡那些問你hashmap和hashtable區別是什么,java的一些技術問題,c++智能指針的問題,唯一一次印象深刻的是我老板面試時問我,你覺得軟件開發最難的地方在哪呢?當時著實讓我想了好久。
          技術可以用來玩,但不能隨便在項目里面玩,這點很重要。
          其實還是性格問題,技術人員都不喜歡主動發言交流,不喜歡走進客戶,不喜歡走出去問客戶到底要什么,所以說中國的軟件很適合外包。

            回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-24 00:59 岑文初
          @一意孤行
          呵呵,大部分都同意啦,只是有句俗話說的好:少不讀三國,老不讀紅樓,在適合的時候做適合的事情,青春就是用來燒的,這也是將來成熟的一種歷練。感謝你對我的關注,對我來說,技術是一種愛好,但是現在我更在乎的是產品,不再會和過去一樣為了技術而技術,如何用技術來支持產品滿足用戶是我在乎的(當然設計的好的架構(不是啥開源框架,呵呵)在用戶需求不斷變化的時候可以更快的響應,能夠前瞻到用戶的潛在需求,挖掘出用戶真正的需求)。最后貼一段我的Boss(菲青)前一陣子給我的一段評語:回放翁的文章。放翁和自雪應該是阿里/淘寶開放的先行者。從08年我們開始干開放的活兒,就是大家從無到有的累積。當然,新業務的建立需要時間,革命尚未成功。但是,看到放翁的轉變從一個技術狂愛者到一個以業務為支撐的技術專家,我很佩服他的成長,也感覺TOP很幸運有了這些人,才使得TOP能夠繼續成長。我們的目標是以技術來支撐,改變業務產品,但不是技術主導業務。當然,因為我們流量及業務復雜度的關系,這中間沉淀下來的技術含量絕不亞于淘寶內部的一些大型系統!  回復  更多評論
            

          # re: Web服務請求異步化測試 2010-06-24 08:52 jollyant
          不能為了技術而技術,而是為了滿足用戶需求而是用技術~
          但是任何滿足用戶需求的產品都是以技術支撐的
          任何一個真正的高手都不是天生就是高手,無招勝有招,是需要先從手中無招到手中有招再到心中無招的,這個過程是一定要經歷的~
          首先要學習吸收別人先進的思想,才能讓自己成為真正的高手~
          目前所使用的技術都是前人經過千辛萬苦開發出來的~
          沒有人能到不用別人開發的技術,光靠自己就能滿足用戶的需求吧?!用什么東西去滿足用戶的需求呢?!
          在手中無招的時候去討論要心中無招,只能誤導別人,把新人帶到溝里去~
          學形,學意,會意,悟道~~這個過程終歸是要經歷的
          或許能有一些天才人物從零開始,直接悟道的吧~呵呵
          當然還是希望不要做技術狂人,而成為一個以業務為支撐的技術專家
            回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 日土县| 静乐县| 九龙坡区| 晋中市| 道真| 江川县| 祁阳县| 巩留县| 扶绥县| 大方县| 河北省| 凌海市| 襄城县| 永春县| 禹城市| 十堰市| 德惠市| 富裕县| 昌平区| 大安市| 昌吉市| 清新县| 乐山市| 景德镇市| 博白县| 阳西县| 丹巴县| 阳曲县| 义马市| 汉川市| 延边| 荥经县| 邓州市| 海淀区| 临汾市| 图们市| 宝丰县| 仁怀市| 永靖县| 正蓝旗| 瓦房店市|