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 前端性能測試