效能瓶頸診斷--CPU篇(二)
效能診斷套路之CPU篇,常見CPU指標獲取方式以及CPU瓶頸診斷套路
上一篇文章中,我簡單介紹了常見的CPU指標,介紹了這些指標的定義以及這些指標涉及的原理,那麼這篇文章就到了實戰的環節。我將介紹這些常用指標的獲取方式以及相關的工具。並且會用幾個示例總結出系統CPU瓶頸的診斷套路和經驗,包括傳統的程式以及java程式。這篇文章可能涉及很多效能工具,我儘量不讓這篇文章成為簡單的工具羅列,會盡可能將這些工具串起來,寫的有意思一些。好,下面開始探索之旅。
簡單回顧一下上篇文章中我提到的CPU效能指標,主要包括以下幾個,CPUload,CPU使用率,上下文切換以及中斷,那麼這篇文章也就分別介紹這些指標的獲取工具。
CPU使用率&load
這裡面我稍微調換一下順序,其實當系統發生瓶頸時,我們第一會關注的還是CPU使用率以及平均負載情況,使用的工具一般也是最常用的即top。下面一張圖簡單展示top的介面

top個人把它定位成一個萬金油的效能監控工具,因為這個工具能夠反映出的效能指標覆蓋面是最廣的,我們一塊一塊的來看,首先是上面的第一行,第一行展示了當前CPU的基本資訊,包括了以下的資訊
CPU啟動時間 使用者數量 平均負載(1min,3min,15min)
接下來第二行展示了當前系統執行的程序情況,包括了不同狀態下的程序數
總程序數 執行狀態下的程序數 休眠狀態下的程序數 停止狀態程序數 僵死狀態程序數
第三行展示了各種狀態的CPU利用率下面分別介紹一下這些使用率以及含義
user--us(%) 使用者態CPU時間,包括guest時間但不包括nice時間 system--sy(%) 核心態CPU時間 ni--nice(%) 低優先順序使用者CPU時間(取值-20--19數值越大優先順序越低) id--idle(%) 空閒時間,不包括等待CPU時間 wa--iowait(%) CPU等待I/O時間 hi--irq(%) 處理硬體中斷CPU時間 si--softirq(%) 處理軟中斷CPU時間 st--steal(%) 系統在虛擬機器中執行時,被其他虛擬機器佔用的CPU時間
這裡面多提一句,當我們使用top時,按下1鍵會看到每個CPU核的使用情況,如下圖所示

第四行第五行展示了系統的記憶體的使用情況,這裡先不做過多的書名,等到記憶體診斷的相關介紹時會再詳細說明.
下面就是具體程序的詳細情況了。但是我們可能會發現,top有一點不足,就是無法看到每個程序的詳細CPU使用狀況,實際上是有辦法看到這些資訊的,傳統的方法就是直接去proc中尋找答案,proc是Linux系統中程序使用者態與核心態的通訊機制,Linux系統為每一個正在執行的程序在proc檔案系統中建立一個目錄項,裡面記錄了這個程序的一些狀態,包括CPU,記憶體或者I/O等方面的資訊,其中與CPU相關的為/proc/pid/stat,下面是一個具體例項
23179 (java) S 1 23148 23148 0 -1 4202496 55881 7994 4 3 1406 1390 3 2 20 0 82 0 4889246558 2946691072 101260 18446744073709551615 4194304 4196284 140734144683328 140734144665984 140017989423869 0 0 3 16800972 18446744073709551615 0 0 17 2 0 0 0 0 0
這裡面會包括這個程序的一些基本屬性,例如命令,程序號,優先順序等,還有各種狀態所使用的CPU時間,但是這些時間的單位為我在上一篇文章提到過的Jiffies,不是很直觀,這裡面,倪老師的課程中給了個利器,pidstat,它屬於sysstat工具集中的一種,所以,我們首先安裝sysstat
yum -y install sysstat
我們輸入pidstat檢視一下,結果如下圖所示

其中每一項的含義如下
PID:程序號 %usr:使用者空間CPU使用率 %system:核心空間CPU使用率 %guest:執行虛擬機器的CPU時間
CPU上下文切換
下面一個重要的指標則是上下切換的指標監控,由於上下問切換在上篇文章中提到,這也是一個會有很大效能開銷的動作,所以需要相關的工具來監控上下文切換頻率。這裡介紹兩個工具,vmstat以及pidstat -w,首先介紹vmstat,下面是輸入命令後的結果

這個命令中也存在一些和CPU相關的指標,詳細含義如下
cs:上下文切換 us:使用者態CPU時間 sy:核心態CPU時間 id:idle wa:iowait時間 st:steal r:就緒佇列長度 in:每秒中斷數 r:就緒佇列的長度 b:不可中斷態程序數
而pidstat -w命令可以看到的是每秒的中斷數變化,上一篇文章提到的上下文切換型別分為:程序上下文切換,執行緒上下文切換以及中斷上下文切換。這裡面還有一種上下文切換的分類標準,分為自願的上下問切換以及非自願上下文切換。下面分別進行說明
自願上下文切換:指程序無法獲得所需的資源,導致的上下文切換。例如在記憶體,I/O等資源無法得到滿足時會進行自願的上下文切換 非自願上下文切換:程序由於到達時間片被系統強制排程,進而發生的上下文切換,例如在大量程序在爭搶CPU時會發生比較多的非自願上下文切換
下圖展示了pidstat -w的效果,其中cswch/s為自願上下文切換的頻率,nvcswch/s是非自願上下文切換的頻率。

如果需要了解某個執行緒,程序的資訊,可以加入以下的引數
pidstat -wt -p pidinternal
中斷
作為上下文切換中比較特殊的一種,中斷同樣是一種比較重要的切換型別,也需要給與足夠的重視,在top工具中我們可以看到和中斷相關的CPU使用率,其中hi代表了硬中斷使用率,si則代表了軟中斷的使用率。至於詳細的中斷資訊,在/proc檔案系統中有明確的答案,其中/proc/interrupts記錄了硬體中斷的相關資訊,而/proc/softirqs記錄了軟中斷的相關資訊。 下面兩張圖展示了/proc/interrupts與/proc/softirqs的執行情況

這裡介紹一下軟中斷,因為硬體中斷的第一要義就是快速,所以如果程序切換到硬體中斷,會非常快的恢復。軟中斷則是為了非同步,所以更可能會引發效能問題,其中幾個指標的含義如下:

HI:處理最高優先順序的中斷 TIMER:時鐘中斷相關的tasklet NET_TX:把資料包傳送到網絡卡 NET_RX:從網絡卡接收資料包 BLOCK: SCSI:SCSI命令後臺中斷處理 TASKLET:常規tasklet處理 RCU_SOFTIRQ:RCU鎖中斷
OK,一下子