【Linux性能優化4】CPU上下文切換

如何查看系統的CPU上下文切換情況

vmstat可以查看系統的CPU上下文切換情況。它是一個常用的系統性能分析工具,主要用來分析系統的內存情況,也常用來分析系統的CPU上下文切換和中斷的次數。

執行如下的命令:vmstat 5 (每隔5s輸出一組數據)

在這裏插入圖片描述

這裏需要重點關注以下幾列的具體內容:
cs:即context switch 每秒鐘上下文切換的次數,如上圖中紅色框。
in:每秒鐘中斷的次數。如上圖中藍色框
r:就緒隊列的長度,也就是正在運行和等待CPU的進程數。如上圖中的綠色框
b:則是處於不可中斷睡眠狀態的進程數。
Id:即idle 即cpu空閒佔比
us+sy:即爲cpu負載情況,即cpu使用率。

上面的vmstat只是給出了CPU的總體的上下文切換情況,如果要查看每個進程的CPU上下文切換則需要使用pidstat命令 並加上-w選項即可。

ubuntu執行如下的命令:pidstat –w 5

在這裏插入圖片描述

上面的輸出中
PID列爲進程號,
cswch/s爲每秒鐘自願上下文切換次數。
cswch/s則爲每秒鐘非自願上下文切換次數。

所謂的自願上下文切換是指進程無法獲取所需要的資源,例如IO,內存等系統資源不足時會發生自願上下文切換。
而非自願上下文切換,則是由於進程時間片已經到達等原因被系統強制調度進而發生的上下文切換,例如大量的進程都在競爭CPU時就會發生非自願上下文切換。

案例分析

使用sysbench來模擬多線程調度切換的情況
sysbench是一個多線程的基準測試工具,一般用來評估不同系統參數下數據庫的負載情況。在該案例中只是把它當做一個異常進程來模擬CPU上下文切換次數過多的問題。

(1)安裝sysbench
Sudo apt-get update
Sudo apt-get install sysbench

(2)先使用vmstat查看系統空閒狀態下的CPU上下文切換情況
在這裏插入圖片描述

如上的輸出上下文切換次數最大也是291 後面基本維持在130次左右 cpu空閒佔比98%左右 就緒隊列r爲0

(3)然後在中端1中運行如下的命令 模擬系統多線程調度的瓶頸
#以 10 個線程運行 5 分鐘的基準測試,模擬多線程切換的問題
sysbench –test=threads –num-threads=10 --max-time=300 run
在這裏插入圖片描述

然後在第二個中端中運行如下的vmstat命令 查看上下文的切換情況。
在這裏插入圖片描述

從上面的輸出信息可以看到 此時CPU的上下文切換次數已經達到了372662次 cpu的空閒狀態id爲0 就緒隊列的數目r達到了8個
綜合上述可以知道 由於就緒隊列數目達到了8個遠大於CPU數目2 因此會產生的大量的CPU競爭,導致了大量的CPU上下文切換從而使得CPU負載升高達到了100%。

(4)那麼有如何分析到底是哪個進程導致了那麼多的cpu上下文切換呢?
在第三個中端中繼續運行如下的命令 pidstat –w –u 1
在這裏插入圖片描述

從pidstat的輸出可以清楚的看到 cpu的負載升高果然是由sysbench導致的 CPU佔用率已經達到了96.33%。但是下面的上下文切換次數的排列中卻找不到sysbench命令 難道不是sysbench引起的 原來是pidstat命令默認顯示進程的指標數據 需要加上-t選項後纔會顯示線程的指標數據。

在這裏插入圖片描述

在這裏插入圖片描述

從上面的輸出可以看出來sysbench產生的線程所引起的上下文切換次數就達到了3萬多次。

小結

(1)查看cpu上下文切換次數
vmstat 5 每秒鐘輸出5組數據
(2)sysbench模擬多線程調度
sysbench –test=threads –num-threads=10 --max-time=300 run
(3)查看進程狀態
pidstat –w –u 1
如果還是輸出進程中線程的狀態 使用如下命令
pidstat –w –u –t 1
其中-w是輸出進程的數據指標 -u則是輸出CPU的數據指標 -t輸出線程的數據指標

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章