前言
在實際開發(fā)中,有時候會收到一些服務(wù)的監(jiān)控報警苛白,比如CPU飆高,內(nèi)存飆高等焚虱,這個時候购裙,我們會登錄到服務(wù)器上進行排查。本篇博客將涵蓋這方面的知識:Linux性能工具鹃栽。
一次線上問題排查模擬
背景:服務(wù)在平穩(wěn)運行一段時間后躏率,CPU突然飆高。
通過top命令民鼓,可以確認下薇芝,到底是哪個進程導(dǎo)致CPU飆高了(也許是誤報呢?)丰嘉。
可以看到圖中PID是2816的進程夯到,CPU使用率非常高。
使用top -Hp 2816來對進程下的線程進行觀察供嚎。圖中可以發(fā)現(xiàn)黄娘,2825這個線程CPU非常高峭状。
這里利用Python非常方便的把十進制的線程ID轉(zhuǎn)化成了16進制,為什么要這么做呢逼争?
因為在接下來的線程DUMP文件中使用的就是16進制的NID优床。
在實際中,我們應(yīng)該利用jstack pid多DUMP幾次誓焦,因為線程存在狀態(tài)轉(zhuǎn)換胆敞,因此多次DUMP有利于抓取到線程更多的信息。
圖中杂伟,你可以觀察到移层,一個線程得到了鎖,在運行赫粥,遲遲沒有釋放观话,而另一個線程一直在等待這個鎖。至此越平,就可以到去查看代碼去分析為什么鎖遲遲不釋放的原因了频蛔。
性能監(jiān)測工具top詳解
上文的案例中,就使用到了top秦叛,而在實際中晦溪,top的信息量是很大的,這里詳細分析下挣跋。
第一行:
涉及到2個時間三圆,一個是系統(tǒng)時間,一個是機器運行的時間避咆。【我們應(yīng)該重點關(guān)注的是機器運行的時間舟肉,Why? 有時候,重啟機器能帶來很多問題牌借,你懂的度气!】
多少用戶登錄了系統(tǒng)?【通過who/w/history可以查到更多信息】
3個load值是什么含義膨报?
分別代表的是1MIN,5MIN,15MIN機器的負載情況磷籍,如何確定負載的大小呢?需要和CPU的核數(shù)相結(jié)合來看现柠,比如該機器是4核CPU院领,那么如果load值超過了4,就意味著負載很大了够吩!【在top下按下1可以觀察出CPU的個數(shù)】
上述信息比然,其實也可以通過uptime命令來獲取。
第二行:
主要是總共有多少個任務(wù)周循,重點應(yīng)該關(guān)注的是僵尸狀態(tài)的任務(wù)數(shù)强法。
第三行:
主要是CPU的一些信息万俗。
US/SY,說的就是用戶進程和系統(tǒng)進程使用CPU的占比。
NI,即NICE贰盗,表示被調(diào)整過線程優(yōu)先級的進程占比,這個比例正常不應(yīng)該很大库倘。
ID,表示空閑论矾;WA表示資源等待的時間教翩,比如在瞬時大流量下,服務(wù)打了很多日志的話贪壳,那么這個值就會飆高饱亿,因為這會很消耗資源的。
HI寥袭,硬中斷路捧,一般就是外設(shè)引起的,如果HI飆高的話传黄,那么意味著外設(shè)在硬件層面出現(xiàn)了問題。SI表示軟中斷队寇。
ST膘掰,即steel,如果該主機是虛擬的話會有這個ST信息佳遣,也即是該虛擬機從宿主機獲取CPU的時間片的百分占比识埋。
第四和第五行:
這里主要說2個概念性的東西:buffer 和 cache。
buffer主要是什么呢零渐?應(yīng)該是待處理的數(shù)據(jù)窒舟,主要是處理2個系統(tǒng)之間速度不匹配的問題。而cache诵盼,一般應(yīng)該是結(jié)果數(shù)據(jù)的緩存惠豺,比如從DB加載一些信息供查詢用。
SWAP分區(qū)风宁,就是想利用硬盤的做一部分緩存洁墙,如果SWAP交換非常頻繁的話,就是說內(nèi)存不夠用戒财!
列表說明:
PID ?進程ID热监、USER 用戶、PR 優(yōu)先級饮寞、VIRT 虛擬內(nèi)存孝扛、RES 駐留內(nèi)存列吼、SHR 共享內(nèi)存
這里需要指出的是,RES表示的是該進程實際占用的內(nèi)存苦始,而并不是申請的內(nèi)存大小冈欢。也就是說當(dāng)前進程所占用的內(nèi)存物理大小是 ? RES-SHR。