線上性能問題初步排查方法
阿新 • • 發佈:2017-05-09
uniq 查看 含義 常用 inf 如果 cep 建立 ren
引言
有時候有很多問題只有在線上或者預發環境才能發現,而線上又不能Debug,所以線上問題定位就只能看日誌,系統狀態和Dump線程,本文只是簡單的介紹一些常用的工具,幫助定位線上問題。
問題定位
1: 首先使用TOP命令查看每個進程的情況,顯示如下:
我們的程序是Java應用,所以只需要關註COMMAND是Java的性能數據,COMMAND表示啟動當前進程的命令,在Java進程這一行裏可以看到CPU利用率是300%,不用擔心,這個是當前機器所有核加在一起的CPU利用率。
2: 再使用Top的交互命令數字1查看每個CPU的性能數據。
命令行顯示了CPU4,說明這是一個5核的虛擬機,平均每個CPU利用率在60%以上。如果這裏顯示CPU利用率100%,則很有可能程序裏寫了一個死循環。這些參數的含義,可以對比下表:
3: 使用Top的交互命令H查看每個線程的性能信息。
在這裏可能會出現三種情況:
- 如果是第一種情況,也有可能是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降低到100
6:重啟jboss,再dump線程信息,然後統計,WAITING(onobjectmonitor)的線程減少了170。
其他命令
- 查看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行和後面兩行。
線上性能問題初步排查方法