1、CPU上下文切換多線程
一、上下文切換,有時也稱作進程切換或任務切換,是指CPU從一個進程或線程切換到另外一個進程或線程。工具
二、vmstat是一個經常使用的系統性能分析工具,主要用來分析系統內存使用狀況,也經常使用來分析CPU上下文切換和中斷的次數。性能
例:vmstat -w線程
上下文切換須要特別關注的四列內容:3d
cs(context switch) 是每秒上下文切換的次數。
in(interrupt) 則是每秒中斷的次數。
r(Running or Runnable) 是就緒隊列的長度。
b(Blocked) 則是處於不可中斷睡眠狀態的進程數。blog
這個例子中的上下文切換次數 cs 是 12 次,系統中斷次數in則是93次,而就緒隊列長度 r 和不可中斷狀態進程數 b 都是 0。隊列
三、vmstat只給出了系統整體的上下文切換狀況,若是要看每一個進程的詳細狀況,就須要pidstat了,加上-w選項進程
例:pidstat -w 2內存
需關注:cswch ,表示每秒自願上下文切換(voluntary context switches)的次數資源
nvcswch ,表示每秒非自願上下文切換(non voluntary context switches)的次數。
自願上下文切換:是指進程沒法獲取所需資源,致使的上下文切換。好比說, I/O、內存等系統資源不足時,就會發生自願上下文切換。
非自願上下文切換:則是指進程因爲時間片已到等緣由,被系統強制調度,進而發生的上下文切換。好比說,大量進程都在爭搶 CPU 時,就容易發生非自願上下文切換。
2、使用sysbench 來模擬系統多線程調度切換的狀況
二、解壓tar xvf sysbench-0.4.12.14.tar.gz
三、進入解壓目錄並執行 ./configure
四、make && make install
五、在第一個終端執行 sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run
六、在第二個終端運行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 的佔用率升高。
七、使用pidstat查看CPU和進程上下文切換狀況:
pidstat -wt -u 1 3 # -wt 參數表示輸出線程指標,而 -u 參數則表示輸出 CPU 使用指標
從 pidstat 的輸出你能夠發現,CPU 使用率的升高果真是 sysbench 致使的,它的 CPU 使用率已經達到了 194%,雖然 sysbench 進程(也就是主線程)的上下文切換次數看起來不多,可是它的子線程的上下文切換次數卻有不少。看來,上下文切換罪魁禍首,仍是過多的 sysbench 線程。
八、繼續查看中斷次數的詳細信息
執行:watch -d cat /proc/interrupts # -d表示高亮顯示變化的參數
觀察一段時間,能夠發現變化最快的是從新調度中斷(RES),這個中斷類型表示,喚醒空閒狀態的 CPU 來調度新的任務運行。這是多處理器系統(SMP)中,調度器用來分散任務到不一樣 CPU 的機制,一般也被稱爲處理器中斷。
總結:
每秒上下文切換多少次算正常?
這個數值主要取決於系統CPU的性能,若是上下文切換比較穩定,那在1萬如下都算是正常,若是超過1萬或者切換次數出現很大的增加,就極可能出現了性能問題。
cswch ,自願上下文切換的次數增多了,說明系統正在等待資源,有可能發生了I/O等其它問題;
nvcswch ,非自願上下文切換的次數增多了,說明進程都在強制調度,也就是在爭搶CPU,說明CPU性能成了瓶頸;
in,中斷次數增多了,說明CPU被中斷,經過分析/proc/interrupt文件來確認中斷類型。