java效能問題排查提效指令碼工具
在效能測試過程中,往往會出現各種各樣的效能瓶頸。其中java常見瓶頸故障模型有cpu資源瓶頸;檔案IO瓶頸;網路IO瓶頸;記憶體資源瓶頸;資源消耗不高程式本身執行慢等場景模型。
如何快速定位分析這些型別瓶頸?工欲善其事必先利其器。
本文主要講述針對cpu高耗和網路IO瓶頸兩個場景,使用排查提效指令碼工具快速定位分析效能瓶頸
場景一:當伺服器CPU高耗原因分析,如何快速定位到佔用cpu高的使用者執行緒
場景二:懷疑網路連線問題,如何快速分析網路TCP狀態
原始做法:
場景一:
- top命令找出消耗CPU高的Java程序及其執行緒id:
- 開啟執行緒顯示模式(top -H,或是開啟top後按H)
- 按CPU使用率排序(top預設是按CPU使用降序,已經合要求;開啟top後按P可以顯式指定按CPU使用降序)
- 記下Java程序id及其CPU高的執行緒id
- 檢視消耗CPU高的執行緒棧:
- 用程序id作為引數,jstack出有問題的Java程序
- 把上述記錄的10進位制執行緒id手動轉換成十六進位制執行緒id(可以用printf %x 1234)
- 在jstack輸出中查詢十六進位制的執行緒id(可以用vim的查詢功能/0x1234,或是grep 0x1234 -A 20)
- 檢視對應的執行緒棧,分析問題
排查問題時,會要多次上面的操作以分析確定問題,這個過程太繁瑣太慢了。
場景二:
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指令碼,用於快速排查Java的CPU效能問題(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
連線狀態的個數。
支援Linux
、Mac
、Windows
(cygwin
、MSSYS
)。
像Nginx
、Apache
的機器上需要檢視,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