服務端cpu占用100%,如何排查?本文從java進程和sql給出排查思路。
A.java進程---大致流程是找出進程的pid-找到進程下占用資源最大的線程-用jstack打印出進程快照
linux:
1.top -c找到占用cpu較高的進程,獲取到[pid]
2.top -Hp [pid],查看該進程對應的線程,找到線程中占用cpu較高的線程id(tid)
3.jstack -l [pid] > /path/[pid].stack,打印出進程此時的快照
4.vi [pid].stack或者cat [pid].stack|grep '[tid]的16進制' -C 8,查看該線程在cpu占用100%時做了什么
使用截圖:
windows:
1.在任務管理中找到占用cpu較高的進程,獲取[pid]
2.使用Process Explorer獲取該[pid]對應的線程,找到占用資源較高的線程id(tid)
3.cmd窗口中輸入jstack -l [pid] > /path/[pid].txt
4.打開文件[pid].txt,查找[tid]的16進制所在的行,查看具體信息
B.sql進程---例如在top -c中看到某個select占cpu100%...大致流程是找出當前具體是哪條sql在跑,再結合代碼與業務分析
在pgsql或navicat等sql工具的客戶端找到“服務器狀態”,然后可以看到服務端此時的sql動態,再將sql具體語句找到,進行分析: