實(shí)戰(zhàn)-用top和jstack命令查找線上CPU消耗過高的線程

前言

在互聯(lián)網(wǎng)行業(yè)中,高并發(fā)的業(yè)務(wù)為常態(tài),作為一名Java高級(jí)工程師,線上問題的排查手段和技巧必須熟練,比如某電商團(tuán)隊(duì)的某個(gè)應(yīng)用突然CPU超高,導(dǎo)致報(bào)警短信和郵件滿天飛,如果讓你來(lái)定位一個(gè)問題,并快速消除預(yù)警,你該怎么辦?其中一點(diǎn)就是如何定位CPU消耗過高的線程,以及如何找到線程正在干的事情。幫助我們快速的定位問題和分析問題。

本文為日常工作中實(shí)戰(zhàn)性較強(qiáng)的一個(gè)問題分析和定位技能。閱讀完本文,你將擁有更高層次的問題分析和處理能力。

如何定位CPU高的線程

大體過程如下:

1、用top -H -p <pid>命令找到CPU高的線程ID。
2、用jstack <vmid>命令打印jvm線程堆棧信息。
3、將第1步拿到的線程ID轉(zhuǎn)換為16進(jìn)制。(可以用命令 printf '%x\n' ID來(lái)輸出16進(jìn)制)
4、用轉(zhuǎn)換后的線程ID在線程堆棧信息中查找匹配的nid線程。
5、到此已經(jīng)找到線程,以及線程棧的詳細(xì)信息??梢愿鶕?jù)這些信息來(lái)判斷應(yīng)用當(dāng)前正在干什么壞事了。

定位Java線程CPU消耗高的線程(top -H命令)

命令:pid為jvm進(jìn)程號(hào)

top -H -p <pid>

作用:列出指定進(jìn)程下線程的信息,會(huì)按CPU的使用占比從大到小排列。

top -H -p <pid>得到的線程堆??煺招畔?/div>

上圖中列分別代表的意思為:進(jìn)程中的線程ID、用戶名、線程優(yōu)先級(jí)

列名 含義
PID 進(jìn)程ID
USER linux用戶名
PR 線程優(yōu)先級(jí)
NI nice值。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)
VIRT 進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES
RES 進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA
SHR 共享內(nèi)存大小,單位kb
S 進(jìn)程狀態(tài)。
%CPU 上次更新到現(xiàn)在的CPU時(shí)間占用百分比
%MEM 進(jìn)程使用的物理內(nèi)存百分比
TIME+ 進(jìn)程使用的CPU時(shí)間總計(jì),格式:時(shí):分:秒
COMMAND 命令名/命令行

上面的幾個(gè)參數(shù)中,最關(guān)心的是PID、USER、%CPU信息。從上圖中可以看到CPU占比最高的排在第1位,線程ID位14153(十六進(jìn)制為:3749),這個(gè)線程就是我們想要的線程。

jstack命令

命令:pid為jvm進(jìn)程號(hào)
作用:獲取JVM線程堆??煺?/p>

jstack <pid>
jstack得到的線程堆棧信息

在線程堆棧中提供如下的幾個(gè)信息:

1、jvm內(nèi)部的線程ID(tid), 操作系統(tǒng)上對(duì)應(yīng)的線程ID(nid)
2、線程鎖的狀態(tài),以及線程棧的軌跡信息。

如上圖,線程JStack-Test對(duì)應(yīng)的操作系統(tǒng)上的線程ID為0x3749

nid=0x3749

拿到這個(gè)ID,是不是有點(diǎn)高興?有沒有發(fā)現(xiàn)這個(gè)ID就是上一步中用top命令得到的ID?

有了線程堆棧信息,就能夠根據(jù)線程棧軌跡、線程的狀態(tài)來(lái)判斷是否有死鎖,線程執(zhí)行的代碼是什么代碼。從而在這些信息的基礎(chǔ)上進(jìn)一步幫助我們分析系統(tǒng)的瓶頸、線程死鎖、CPU資源消耗等情況。

對(duì)于線程堆棧的分析,將另起一篇文章來(lái)講解。
敬請(qǐng)期待?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容