線上性能問題初步排查方法

引言

有時候有不少問題只有在線上或者預發環境才能發現,而線上又不能Debug,因此線上問題定位就只能看日誌,系統狀態和Dump線程,本文只是簡單的介紹一些經常使用的工具,幫助定位線上問題。java

問題定位

1: 首先使用TOP命令查看每一個進程的狀況,顯示以下:linux

咱們的程序是Java應用,因此只須要關注COMMAND是Java的性能數據,COMMAND表示啓動當前進程的命令,在Java進程這一行裏能夠看到CPU利用率是300%,不用擔憂,這個是當前機器全部核加在一塊兒的CPU利用率。

 

2: 再使用Top的交互命令數字1查看每一個CPU的性能數據。apache

命令行顯示了CPU4,說明這是一個5核的虛擬機,平均每一個CPU利用率在60%以上。若是這裏顯示CPU利用率100%,則頗有可能程序裏寫了一個死循環。這些參數的含義,能夠對比下表:

 

 

 

 

 

 

 

 

 

 

3: 使用Top的交互命令H查看每一個線程的性能信息。tomcat

在這裏可能會出現三種狀況:

 

  1. 若是是第一種狀況,也有多是GC形成,咱們能夠用jstat命令看下GC狀況,看看是否是由於持久代或年老代滿了,產生Full GC,致使CPU利用率持續飆高,命令以下。

     

    咱們還能夠把線程Dump下來,看看到底是哪一個線程,執行什麼代碼形成的CPU利用率高。執行如下命令,把線程dump到文件dump17裏。

     

    sudo -u admin /opt/java/bin/jstack  31177 > /home/tengfei.fangtf/dump17
    

    dump出來內容的相似下面這段:工具

    "http-0.0.0.0-7001-97" daemon prio=10 tid=0x000000004f6a8000 nid=0x555e in Object.wait() [0x0000000052423000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on  (a org.apache.tomcat.util.net.AprEndpoint$Worker)
            at java.lang.Object.wait(Object.java:485)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1464)
            - locked  (a org.apache.tomcat.util.net.AprEndpoint$Worker)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1489)
            at java.lang.Thread.run(Thread.java:662)
    

    dump出來的線程ID(nid)是十六進制的,而咱們用TOP命令看到的線程ID是10進制的,因此咱們要printf命令轉換一下進制。而後用16進制的ID去dump裏找到對應的線程。性能

    優化實戰

    1:查看下TCP鏈接狀態,創建了800多個鏈接,須要儘可能下降ESTABLISHED。優化

    2:用jstack dump看看這些線程都在作什麼。

     

    3:統計下全部線程分別處於什麼狀態,發現大量線程處於WAITING(onobjectmonitor)狀態

     

    4:查看處於WAITING(onobjectmonitor)的線程信息,主要是jboss的工做線程在await。

     

    "http-0.0.0.0-7001-97" daemon prio=10 tid=0x000000004f6a8000 nid=0x555e in Object.wait() [0x0000000052423000]
     java.lang.Thread.State: WAITING (on object monitor)
     at java.lang.Object.wait(Native Method)
     - waiting on <0x00000007969b2280> (a org.apache.tomcat.util.net.AprEndpoint$Worker)
     at java.lang.Object.wait(Object.java:485)
     at org.apache.tomcat.util.net.AprEndpoint$Worker.await(AprEndpoint.java:1464)
     - locked <0x00000007969b2280> (a org.apache.tomcat.util.net.AprEndpoint$Worker)
     at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1489)
     at java.lang.Thread.run(Thread.java:662)

    5:找到jboss的線程配置信息,將maxThreads下降到100ui

    6:重啓jboss,再dump線程信息,而後統計,WAITING(onobjectmonitor)的線程減小了170。.net

    其餘命令
    • 查看CPU信息 cat /proc/cpuinfo
    • 查看內存信息 cat /proc/meminfo
    • 查看Java線程數 ps -eLf | grep java -c
    • 查看linux系統裏打開文件描述符的最大值 ulimit -u
    • 找到日誌裏TOP10的異常:grep ‘Exception’ /home/admin/logs/XX.log |awk -F':|,’ ‘{print $2}’|sort |uniq -c |sort -nr|head -10,找到以後能夠再用-A 2 -B 2,看定位出日誌的前面2行和後面兩行。
相關文章
相關標籤/搜索