原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11484624.html
pidstat命令就可以幫助我們監測到具體線程的上下文切換
通過pidstat -help命令,可以查看到有以下幾個常用參數可以監測線程的性能:
常用參數:
- -u:默認參數,顯示各個進程的cpu使用情況;
- -r:顯示各個進程的內存使用情況;
- -d:顯示各個進程的I/O使用情況;
- -w:顯示每個進程的上下文切換情況;
- -p:指定進程號;
- -t:顯示進程中線程的統計信息
首先,通過pidstat -w -p pid 命令行,我們可以查看到進程的上下文切換:
cswch/s:每秒主動任務上下文切換數量
nvcswch/s:每秒被動任務上下文切換數量
之后,通過pidstat -w -p pid -t 命令行,我們可以查看到具體線程的上下文切換:
Note:
有兩列內容是需要重點關注對象。一個是 cswch ,表示每秒自願上下文切換(voluntary context switches)的次數,另一個則是nvcswch ,表示每秒非自願上下文切換(non voluntary context switches)的次數。
自願上下文切換 cswch
是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內存等系統資源不足時,就會發生自願上下文切換。
非自願上下文切換 nvcswch
則是指進程由於時間片已到等原因,被系統強制調度,進而發生的上下文切換。比如說,大量進程都在爭搶 CPU時,就容易發生非自願上下文切換。
每秒上下文切換多少次才算正常呢?
這個數值其實取決於系統本身的 CPU 性能。如果系統的上下文切換次數比較穩定,那么從數百到一萬以內,都應該算是正常的。但當上下文切換次數超過一萬次,或者切換次數出現數量級的增長時,就很可能已經出現了性能問題。
需要根據上下文切換的類型,再做具體分析。比方說:
- 自願上下文切換變多了,說明進程都在等待資源,有可能發生了 I/O 等其他問題;
- 非自願上下文切換變多了,說明進程都在被強制調度,也就是都在爭搶 CPU,說明 CPU 的確成了瓶頸;
- 中斷次數變多了,說明 CPU 被中斷處理程序占用,還需要通過查看 /proc/interrupts 文件來分析具體的中斷類型。