1. 程式人生 > >CPU上下文切換分析

CPU上下文切換分析

一、CPU上下文切換

1、上下文切換,有時也稱做程序切換或任務切換,是指CPU從一個程序或執行緒切換到另一個程序或執行緒。

2、vmstat是一個常用的系統性能分析工具,主要用來分析系統記憶體使用情況,也常用來分析CPU上下文切換和中斷的次數。

例:vmstat -w

上下文切換需要特別關注的四列內容:

cs(context switch)  是每秒上下文切換的次數。
in(interrupt)  則是每秒中斷的次數。
r(Running or Runnable)  是就緒佇列的長度。
b(Blocked)  則是處於不可中斷睡眠狀態的程序數。

這個例子中的上下文切換次數 cs 是 12 次,系統中斷次數in則是93次,而就緒佇列長度 r 和不可中斷狀態程序數 b 都是 0。

3、vmstat只給出了系統總體的上下文切換情況,如果要看每個程序的詳細情況,就需要pidstat了,加上-w選項

例:pidstat -w  2

需關注:cswch ,表示每秒自願上下文切換(voluntary context switches)的次數

     nvcswch ,表示每秒非自願上下文切換(non voluntary context switches)的次數。

自願上下文切換:是指程序無法獲取所需資源,導致的上下文切換。比如說, I/O、記憶體等系統資源不足時,就會發生自願上下文切換。

非自願上下文切換:則是指程序由於時間片已到等原因,被系統強制排程,進而發生的上下文切換。比如說,大量程序都在爭搶 CPU 時,就容易發生非自願上下文切換。

 

二、使用sysbench 來模擬系統多執行緒排程切換的情況

1、預先安裝 sysbenchsysstat  包

2、解壓tar xvf sysbench-0.4.12.14.tar.gz

3、進入解壓目錄並執行 ./configure

4、make && make install

5、在第一個終端執行 sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run

6、在第二個終端執行vmstat觀察上下文切換情況:

vmstat -w 1 3

 

可以發現,上下文切換cs已經上升到了256萬,同時:

r 列:就緒佇列的長度已經到了 9,遠遠超過了系統 CPU 的個數 2,所以肯定會有大量的 CPU 競爭。

us(user)和 sy(system)列:這兩列的 CPU 使用率加起來上升到了 100%,其中系統 CPU 使用率,也就是 sy 列高達 89%,說明 CPU 主要是被核心佔用了。

in 列:中斷次數也上升到了 3000左右。

綜合這幾個指標,我們可以知道,系統的就緒佇列過長,也就是正在執行和等待 CPU 的程序數過多,導致了大量的上下文切換,而上下文切換又導致了系統 CPU 的佔用率升高。

 7、使用pidstat檢視CPU和程序上下文切換情況:

pidstat -wt -u 1 3   # -wt 引數表示輸出執行緒指標,而 -u 引數則表示輸出 CPU 使用指標

從 pidstat 的輸出你可以發現,CPU 使用率的升高果然是 sysbench 導致的,它的 CPU 使用率已經達到了 194%,雖然 sysbench 程序(也就是主執行緒)的上下文切換次數看起來很少,但是它的子執行緒的上下文切換次數卻有很多。看來,上下文切換罪魁禍首,還是過多的 sysbench 執行緒。

8、繼續檢視中斷次數的詳細資訊

執行:watch -d cat /proc/interrupts  # -d表示高亮顯示變化的引數

觀察一段時間,可以發現變化最快的是重新排程中斷(RES),這個中斷型別表示,喚醒空閒狀態的 CPU 來排程新的任務執行。這是多處理器系統(SMP)中,排程器用來分散任務到不同 CPU 的機制,通常也被稱為處理器中斷。

總結:

每秒上下文切換多少次算正常?

這個數值主要取決於系統CPU的效能,如果上下文切換比較穩定,那在1萬以下都算是正常,如果超過1萬或者切換次數出現很大的增長,就很可能出現了效能問題。

cswch ,自願上下文切換的次數增多了,說明系統正在等待資源,有可能發生了I/O等其它問題;

nvcswch ,非自願上下文切換的次數增多了,說明程序都在強制排程,也就是在爭搶CPU,說明CPU效能成了瓶頸;

in,中斷次數增多了,說明CPU被中斷,通過分析/proc/interrupt檔案來確認中斷型別。