1. 程式人生 > 實用技巧 >java效能問題排查提效指令碼工具

java效能問題排查提效指令碼工具

在效能測試過程中,往往會出現各種各樣的效能瓶頸。其中java常見瓶頸故障模型有cpu資源瓶頸;檔案IO瓶頸;網路IO瓶頸;記憶體資源瓶頸;資源消耗不高程式本身執行慢等場景模型。

如何快速定位分析這些型別瓶頸?工欲善其事必先利其器。

本文主要講述針對cpu高耗和網路IO瓶頸兩個場景,使用排查提效指令碼工具快速定位分析效能瓶頸

場景一:當伺服器CPU高耗原因分析,如何快速定位到佔用cpu高的使用者執行緒

場景二:懷疑網路連線問題,如何快速分析網路TCP狀態

原始做法:

場景一:

  1. top命令找出消耗CPU高的Java程序及其執行緒id
    1. 開啟執行緒顯示模式(top -H,或是開啟top後按H
    2. CPU使用率排序(top預設是按CPU使用降序,已經合要求;開啟top後按P可以顯式指定按CPU使用降序)
    3. 記下Java程序id及其CPU高的執行緒id
  1. 檢視消耗CPU高的執行緒棧:
    1. 用程序id作為引數,jstack出有問題的Java程序
    2. 把上述記錄的10進位制執行緒id手動轉換成十六進位制執行緒id(可以用printf %x 1234
    3. jstack輸出中查詢十六進位制的執行緒id(可以用vim的查詢功能/0x1234,或是grep 0x1234 -A 20
  1. 檢視對應的執行緒棧,分析問題

排查問題時,會要多次上面的操作以分析確定問題,這個過程太繁瑣太慢了

場景二:

1.先用netstat命令分析網路TCP連線各個狀態數。

2.然後tcpdump分析

排查問題時,命令複雜輸入耗時,有時記不住,還得臨時百度

推薦玩法:

打包下載整個提效工具指令碼

wget --no-check-certificate https://github.com/oldratlee/useful-scripts/archive/release.zip

解壓目錄

unzip release.zip

檔案中包含的常用指令碼

推薦指令碼用法:

場景一:

show-busy-java-threads指令碼,用於快速排查JavaCPU效能問題(top us值過高),自動查出執行的Java程序中消耗CPU多的執行緒,並打印出其執行緒棧,從而確定導致效能問題的方法呼叫。

show-busy-java-threads

# 從所有執行的Java程序中找出最消耗CPU的執行緒(預設5個),打印出其執行緒棧

# 預設會自動從所有的Java程序中找出最消耗CPU的執行緒,這樣用更方便# 當然你可以手動指定要分析的Java程序Id,以保證只會顯示你關心的那個Java程序的資訊

show-busy-java-threads -p <指定的Java程序Id>

show-busy-java-threads -c <要顯示的執行緒棧數>

show-busy-java-threads <重複執行的間隔秒數> [<重複執行的次數>]

# 多次執行;這2個引數的使用方式類似vmstat命令

show-busy-java-threads -a <執行輸出的記錄到的檔案># 記錄到檔案以方便回溯檢視

show-busy-java-threads -S <儲存jstack輸出檔案的目錄># 指定jstack輸出檔案的儲存目錄,方便記錄以後續分析

示例:

場景二:

tcp-connection-state-counter指令碼,統計各個TCP連線狀態的個數。

支援LinuxMacWindowscygwinMSSYS)。

NginxApache的機器上需要檢視,TCP連線的個數,以判定

  • 連線數、負荷
  • 是否有攻擊,檢視SYN_RECV數(SYN攻擊)
  • TIME_WAIT數,太多會導致TCP: time wait bucket table overflow

示例:

參考文件:

https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#-show-busy-java-threads