服務器常常宕機,排查問題思路

服務器宕機排查記錄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運行狀況,對排查問題形成不便,排查發現是管理員賬號中存在"_",最後更換管理員賬號啓動腳本,正常

相關文章
相關標籤/搜索