qileilove

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

          Tomcat重啟負載高問題定位

           某產(chǎn)品每次重啟Tomcat都會收到CPU告警信息,重啟階段CPU使用率可以達到80%~90%以上,會持續(xù)一段時間回降(具體時間沒有考察)。應(yīng)產(chǎn)品方要求,對該問題進行分析定位。
            因線上產(chǎn)品不能隨便重啟,問題定位階段使用的是同規(guī)格的云主機QA19,該環(huán)境上有和線上一致的應(yīng)用程序,且重啟tomcat時,也會有CPU飆高的現(xiàn)象。
            負載高的原因:
            重啟的時候?qū)Y源使用情況進行監(jiān)控,并通過top-H+jstack分析消耗CPU過高的線程堆棧信息。
            通過監(jiān)控重啟時的資源使用情況,在qa19這臺機器上,重啟一次,CPU飆高的持續(xù)時間約為50-60s左右。
            通過top-H+jstack定位消耗CPU過高的線程,發(fā)現(xiàn)有三個:
            1.springapplicationContext在web容器中加載過程消耗的資源:(部分堆棧信息)
          "main" prio=10 tid=0x000000004166f800 nid=0x100f runnable [0x00007fbf42987000]
          java.lang.Thread.State: RUNNABLE
          at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
          at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
          at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
          at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
          at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
          at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
            2.兩個編譯線程:
          "C2CompilerThread1"daemonprio=10tid=0x00007fec48001800nid=0x13c4runnable
          java.lang.Thread.State:RUNNABLE
          "C2CompilerThread0"daemonprio=10tid=0x00000000407c1000nid=0x13c3runnable
          java.lang.Thread.State:RUNNABLE
          嘗試的解決方法:
            helloJava的兩篇文章中給出了兩種配置方法:見:http://hellojava.info/?p=195以及http://hellojava.info/?p=201
            嘗試加上-XX:+TieredCompilation,期望借助多層編譯來緩解這個問題:
            在tomcatjvm參數(shù)中增加該配置項,資源監(jiān)控CPU飆高持續(xù)時間降低到45s左右,比原來少了10s+,略有效果
            嘗試加一個-XX:CICompilerCount參數(shù)來試試,這個值默認是2,也就是說2個c2的編譯線程來進行編譯:
            因為QA19和線上tomcat應(yīng)用服務(wù)器都是2個核的云主機,所以默認值2應(yīng)該是最優(yōu)值,嘗試把該值改成1or4,沒有起到優(yōu)化效果。
            存在問題:
            對于QA19性能測試環(huán)境來說,重啟后沒有其他請求引入,但是線上環(huán)境重啟后會不斷有請求過來,所以CPU飆高的時間會持續(xù)時間更長。
            對于性能測試環(huán)境,重啟之后的進行第一次并發(fā)測試,前期負載同樣會很高,如下圖:
            同樣,在測試開始后通過top-H+jstack分析堆棧信息,分析得到兩個原因:
            啟動各種各樣的線程進行處理請求,如AJP線程、和數(shù)據(jù)通信的線程、和ActiveMQ通信的線程等,會短時間內(nèi)耗費一些資源
            另外,測試剛啟動時,"C2CompilerThread1"該線程耗費資源過多,會一段時間內(nèi)持續(xù)在40%~80%的CPU消耗
            測試時,增加-XX:+TieredCompilation該參數(shù),對比資源使用情況如下:
            并發(fā)50個線程時,增加參數(shù)之前(左圖)和增加參數(shù)后(右圖)
            
              并發(fā)100個線程,增加參數(shù)前(左圖)和增加參數(shù)后(右圖)
            結(jié)論:
            可以看出即便有流量引入,-XX:+TieredCompilation該參數(shù)也是起到了一定作用,使得飆高的CPU盡快回落。

          posted on 2014-01-10 09:32 順其自然EVO 閱讀(973) 評論(0)  編輯  收藏 所屬分類: web 前端性能測試

          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 盐池县| 牙克石市| 镇远县| 洪雅县| 浦东新区| 长宁县| 上思县| 仁怀市| 郁南县| 阜新| 县级市| 靖边县| 湖口县| 宁陵县| 长顺县| 岳阳县| 剑河县| 广元市| 延边| 凤凰县| 西畴县| 沂源县| 望江县| 江西省| 武平县| 迁安市| 大荔县| 略阳县| 阿拉善右旗| 和硕县| 绥阳县| 高清| 辽中县| 育儿| 扬州市| 谢通门县| 临潭县| 连云港市| 巴塘县| 香河县| 庐江县|