cpu使用率是如何統(tǒng)計出來的?
這里的cpu使用率與linux 命令top-H-p<pid> 的線程%CPU類似,一段采樣間隔時間內(nèi),當(dāng)前JVM里各個線程的增量cpu時間與采樣間隔時間的比例。
工作原理說明:
- 首先第一次采樣,獲取所有線程的CPU時間(調(diào)用的是java.lang.management.ThreadMXBean#getThreadCpuTime()及sun.management.HotspotThreadMBean.getInternalThreadCpuTimes()接口)
- 然后睡眠等待一個間隔時間(默認(rèn)為200ms,可以通過-i指定間隔時間)
- 再次第二次采樣,獲取所有線程的CPU時間,對比兩次采樣數(shù)據(jù),計算出每個線程的增量CPU時間
- 線程CPU使用率 = 線程增量CPU時間 / 采樣間隔時間 * 100%
注意: 這個統(tǒng)計也會產(chǎn)生一定的開銷(JDK這個接口本身開銷比較大),因此會看到as的線程占用一定的百分比,為了降低統(tǒng)計自身的開銷帶來的影響,可以把采樣間隔拉長一些,比如5000毫秒。
使用參考
當(dāng)前最忙的前N個線程并打印堆棧:

image

image
- 沒有線程ID,包含[Internal]表示為JVM內(nèi)部線程,參考dashboard命令的介紹。
- cpuUsage為采樣間隔時間內(nèi)線程的CPU使用率,與dashboard命令的數(shù)據(jù)一致。
- deltaTime為采樣間隔時間內(nèi)線程的增量CPU時間,小于1ms時被取整顯示為0ms。
- time 線程運行總CPU時間。
注意:線程棧為第二采樣結(jié)束時獲取,不能表明采樣間隔時間內(nèi)該線程都是在處理相同的任務(wù)。建議間隔時間不要太長,可能間隔時間越大越不準(zhǔn)確。 可以根據(jù)具體情況嘗試指定不同的間隔時間,觀察輸出結(jié)果。
image

image
當(dāng)沒有參數(shù)時,顯示第一頁線程的信息
默認(rèn)按照CPU增量時間降序排列,只顯示第一頁數(shù)據(jù)。

image
- thread –all, 顯示所有匹配的線程
顯示所有匹配線程信息,有時需要獲取全部JVM的線程數(shù)據(jù)進行分析。
- thread id, 顯示指定線程的運行堆棧

image
- thread -b, 找出當(dāng)前阻塞其他線程的線程
有時候我們發(fā)現(xiàn)應(yīng)用卡住了, 通常是由于某個線程拿住了某個鎖, 并且其他線程都在等待這把鎖造成的。 為了排查這類問題, arthas提供了thread-b, 一鍵找出那個罪魁禍?zhǔn)住?br> 注意, 目前只支持找出synchronized關(guān)鍵字阻塞住的線程, 如果是java.util.concurrent.Lock, 目前還不支持。目前使用效果不佳
- thread -i, 指定采樣時間間隔
- thread-i1000 : 統(tǒng)計最近1000ms內(nèi)的線程CPU時間。
- thread-n3-i1000 : 列出1000ms內(nèi)最忙的3個線程棧

image
- thread –state ,查看指定狀態(tài)的線程

image
作者 | 智哥
本文為碼農(nóng)架構(gòu)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。