關注+星標公眾號,不錯過精彩內容

譯者 | 子沐愛掃地?
vmstat?工具來查詢你系統的上下文切換。vmstat?是一種常用的系統性能分析工具。主要用于分析內存使用情況,也常用于分析 CPU 上下文切換和中斷的次數。vmstat 5(5 秒輸出間隔):
cs(context switch):每秒上下文切換的次數。in(interrupt):每秒的中斷數。r(running | runnable):就緒隊列的長度,即正在運行和等待 CPU 的進程數。b(blocked):處于不間斷睡眠狀態的進程數。33?次,系統中斷次數為?25?次,就緒隊列長度,不間斷狀態進程數均為?0。vmstat?工具只給出了系統的整體上下文切換的信息。要查看每個進程的詳細信息,您需要使用?pidstat。添加?-w?選項,您可以看到每個進程的上下文切換:#?Output?interval?is?5
$?pidstat?-w?5
Linux?4.15.0?(ubuntu)??09/23/18??_x86_64_??(2?CPU)
08:18:26??????UID???????PID???cswch/s?nvcswch/s??Command
08:18:31????????0?????????1??????0.20??????0.00??systemd
08:18:31????????0?????????8??????5.40??????0.00??rcu_sched
...
cswch?和?nvcswch。其中,cswch?表示每秒自愿上下文切換的次數,nvcswch?表示每秒非自愿上下文切換的次數。sysbench?(https://github.com/akopytov/sysbenc),一個多線程的基準測試工具通過生成負載來模擬上下文切換過多的問題。假設您已經在 Linux 系統上安裝了?sysbench?和?sysstat。vmstat:
cs?是?35,中斷次數?in?是?19,r?和?b?都是?0。由于我目前沒有其他任務在運行,因此它們是空閑系統中的上下文切換數量。sysbench?來模擬多線程調度系統的瓶頸:$?sysbench?--threads=10?--max-time=300?threads?run
vmstat?輸出了與上面不同的結果:
cs?欄的上下文切換次數從之前的?35?次突增到?139?萬次。同時,注意觀察其他幾個指標:r:就緒隊列的長度已達到?8us?和?sy:us?和?sy?的 CPU 使用率加起來是?100%,系統 CPU 使用率是?84%,說明 CPU 主要被內核占用。in:中斷數也上升到了?10000,說明中斷處理也是一個潛在的問題。pidstat,看看 CPU 和進程上下文切換的情況:#?1?means?output?interval?is?1?second
#?-w:?output?process?switching?index,
#?-u:?output?CPU?usage?index
$?pidstat?-w?-u?1
08:06:33??????UID???????PID????%usr?%system??%guest???%wait????%CPU???CPU??Command
08:06:34????????0?????10488???30.00??100.00????0.00????0.00??100.00?????0??sysbench
08:06:34????????0?????26326????0.00????1.00????0.00????0.00????1.00?????0??kworker/u4:2
08:06:33??????UID???????PID???cswch/s?nvcswch/s??Command
08:06:34????????0?????????8?????11.00??????0.00??rcu_sched
08:06:34????????0????????16??????1.00??????0.00??ksoftirqd/1
08:06:34????????0???????471??????1.00??????0.00??hv_balloon
08:06:34????????0??????1230??????1.00??????0.00??iscsid
08:06:34????????0??????4089??????1.00??????0.00??kworker/1:5
08:06:34????????0??????4333??????1.00??????0.00??kworker/0:3
08:06:34????????0?????10499??????1.00????224.00??pidstat
08:06:34????????0?????26326????236.00??????0.00??kworker/u4:2
08:06:34?????1000?????26784????223.00??????0.00??sshd
pidstat?的輸出可以發現,CPU 使用率的增加確實是?sysbench?造成的,它的 CPU 使用率已經達到了?100%。但上下文切換來自其他進程,包括非自愿上下文切換頻率最高的?pidstat,以及自愿上下文切換頻率最高的內核線程?kworker?和?sshd。注意:默認情況下? pidstat?只顯示進程的上下文切換,如果要查看實際線程的上下文切換,請添加?-t?選項。
/proc/interrupts?文件。該文件會提供一個只讀的中斷使用情況。#?-d:?Highlight?the?change?area
$?watch?-d?cat?/proc/interrupts
???????????CPU0???????CPU1
...
RES:????2450431????5279697???Rescheduling?interrupts
...
10000,或者切換次數快速增加時,很可能是出現了性能問題。/proc/interrupts?文件來分析具體的中斷類型。

