服務器宕機排查記錄java
問題症狀 :服務器內存佔用持續增加,性能低下,併發上不去,隔幾天宕機web
排查思路 :分析出內存泄露模塊,分析出性能瓶頸,調優JVM數據庫
使用工具 :jconsole、jprofilerapache
使用jconsole鏈接,通過測試獲得以下圖表,可能爲JVM配置不當或內存泄露緩存
經過thread dump發現線程大都阻在HTTPCLIENT獲取鏈接方法上,經分析可能爲HTTPCLIENT鏈接未及時釋放服務器
問題一:HTTPCLIENT鏈接沒有真正釋放網絡
THREAD DUMP日誌併發
"[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'" id=50 idx=0xbc tid=1596 prio=5 alive, in native, waiting, daemon
-- Waiting for notification on: org/apache/commons/httpclient工具
/MultiThreadedHttpConnectionManager$ConnectionPool@0x03801D20[fat lock]
at jrockit/vm/Threads.waitForNotifySignal(JLjava/lang/Object;)Z(Native Method)
at java/lang/Object.wait(J)V(Native Method)[optimized]
at org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.doGetConnection性能
(MultiThreadedHttpConnectionManager.java:518)[optimized]
^-- Lock released while waiting: org/apache/commons/httpclient
/MultiThreadedHttpConnectionManager$ConnectionPool@0x03801D20[fat lock]
at org/apache/commons/httpclient/MultiThreadedHttpConnectionManager
.getConnectionWithTimeout(MultiThreadedHttpConnectionManager.java:416)[optimized]
at org/apache/commons/httpclient/HttpMethodDirector.executeMethod(HttpMethodDirector
.java:153)[optimized]
at org/apache/commons/httpclient/HttpClient.executeMethod(HttpClient.java:397)[optimized]
at org/apache/commons/httpclient/HttpClient.executeMethod(HttpClient.java:346)[inlined]
解決辦法 :釋放鏈接,爲了不產生大量CLOSE_WAIT,按期關閉空閒鏈接:
h ttpMethod.releaseConnection();
connectionManager . closeIdleConnections (3000);
問題二:JVM調優,開啓JMX服務,使用JCONSOLE鏈接
SUN JDK
-Xms 1024m
-Xmx1024m
-Xss192k
-XX:PermSize=192M
-XX:+UseParallelGC
- XX:ParallelGCThread=8
-Djava.rmi.server.hostname=172.30.0.232
-Dcom.sun.management.jmxremote.port=7001
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
【調優後】
服務器通過72小時的壓力測試,線程數增長了100個,服務器內存增長了50M,總訪問次數291萬次,咱們判斷服務器目前運行正常,今天主要分析了線程數和內存增長的緣由。
從內存佔用狀況來看,內存最低能釋放到170M左右,以前是120M左右,增加了50M左右
從線程圖表上看,有過兩次線程增加,且堆棧內存佔用都有增長,可是此次的線程數增加和上次不同,咱們的依據是Thread Dump抓包分析、日誌分析、console後臺分析,上次是因爲tmp下文件過多,致使讀取本地文件出現IO超時,而致使線程數急劇增加(400個);而此次應該是因爲網絡問題(ERR日誌中有一些Read Time Out異常)而致使某時段內網絡出現阻塞,weblogic的線程管理器進行了自動優化,增長一些線程,另外單個HOST最大隻能建立100個鏈接,也與此次線程增加數吻合,線程增加,棧內存增加(20M左右),線程中用到對象實例,堆內存天然增加(50M左右),彷佛也合理,依據此咱們判斷目前服務器運行正常。
從LoadRunner圖表來看,週末網絡狀況彷佛不錯,TPS能到16,響應時間也在2S內,比上次圖表好看,依然是凌晨的網絡比白天的好
問題三:內存泄露
經過JMAP命令分析發現jtidy存在內存泄露,通過分析發現時在在異常時沒有釋放資源
1371376 164565120 org.w3c.tidy.Node3
1413005 169560600 org.w3c.tidy.Node
1437838 172540560 org.w3c.tidy.Node
問題四:鏈接數暴漲,分析發現磁盤已滿
問題五:性能瓶頸,經過JPROFILER分析,找出消耗時間最多的方法,進行優化
分析發現,字符串操做耗時大,XSLT解析XML耗時大,優化,合理使用緩存
問題六:數據庫鏈接達到上限
####<2011-8-25 上午08時21分07秒 CST> <Info> <Console> <RD-DCM-03> <AdminServer> <[ACTIVE] ExecuteThread: '32' for queue: 'weblogic.kernel.Default (self-tuning)'> <weblogic> <> <> <1314231667171> <BEA-240002> <Struts module /core is configured to use com.bea.console.internal.ConsolePageFlowRequestProcessor as the request processor, but the <controller> element does not contain a <set-property> for "controllerClass". Page Flow actions in this module may not be handled correctly.>
####<2011-8-25 上午08時21分07秒 CST> <Info> <Console> <RD-DCM-03> <AdminServer> <[ACTIVE] ExecuteThread: '32' for queue: 'weblogic.kernel.Default (self-tuning)'> <weblogic> <> <> <1314231667171> <BEA-240001> <Attempting to instantiate SharedFlowControllers for request /console/core/CoreServerThreadStackDump.do>
####<2011-8-25 上午08時21分07秒 CST> <Info> <Console> <RD-DCM-03> <AdminServer> <[ACTIVE] ExecuteThread: '32' for queue: 'weblogic.kernel.Default (self-tuning)'> <weblogic> <> <> <1314231667171> <BEA-240001> <<ConsoleInteraction: User is viewing <com.bea.console.actions.core.server.ThreadStackDumpAction> for <Server> <com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3DAdminServer%2CType%3DServer%22%29>>>
####<2011-8-25 上午08時21分17秒 CST> <Info> <Common> <RD-DCM-03> <AdminServer> <[ACTIVE] ExecuteThread: '26' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <> <1314231677484> <BEA-000627> <Reached maximum capacity of pool "dcm", making "0" new resource instances instead of "1".>
####<2011-8-25 上午08時21分17秒 CST> <Info> <Common> <RD-DCM-03> <AdminServer> <[ACTIVE] ExecuteThread: '27' for queue: 'weblogic.kernel.Default (self-tuning)'> <<anonymous>> <> <> <1314231677500> <BEA-000627> <Reached maximum capacity of pool "dcm", making "0" new resource instances instead of "1".>
JDBC鏈接池到達極限,設置JDBC Connection Max Capacity
問題七:其餘問題
使用jps查看java進程id時,顯示process informatin unavailable,且jstat沒法鏈接,即沒法圖形化查看JVM運行狀況,對排查問題形成不便,排查發現是管理員賬號中存在"_",最後更換管理員賬號啓動腳本,正常