pidstat:是一個常用的進程性能分析工具,用來實時查看進程的 CPU、內存、I/O 以及上下文切換等性能指標。
常用選項:
-u:表示查看cpu相關的性能指標
-w:表示查看上下文切換情況
-t:查看線程相關的信息,默認是進程的;常與-w結合使用(cpu的上下文切換包括進程的切換、線程的切換、中斷的切換)
-d:展示磁盤 I/O 統計數據
-p:指明進程號
cpu用法示例:
#pidstat -u 5 1 13:37:07 UID PID %usr %system %guest %wait %CPU CPU Command 13:37:12 0 2962 100.00 0.00 0.00 0.00 100.00 1 stress
%usr:用戶空間的cpu使用率
%system:內核空間的cpu使用率
%wait:進程或者線程等待的cpu使用率;此值過高,表示出現進程或線程爭搶CPU的情況
%CPU:總的cpu使用率
查看進程的cpu上下文切換示例:
vmstat只能查看總的cpu上下文切換,pidstat可以查看每個進程的上下文切換
# 每隔 5 秒輸出 1 組數據 $ 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/s:表示每秒自願上下文切換(voluntary context switches)的次數
ncswch/s:表示每秒非自願上下文切換(non voluntary context switches)的次數
這兩個概念一定要牢牢記住,因爲它們意味着不同的性能問題:
所謂自願上下文切換,是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內存等系統資源不足時,就會發生自願上下文切換。
而非自願上下文切換,則是指進程由於時間片已到等原因,被系統強制調度,進而發生的上下文切換。比如說,大量進程都在爭搶 CPU 時,就容易發生非自願上下文切換。
查看線程的cpu上下文切換示例:
# 每隔1秒輸出一組數據(需要 Ctrl+C 才結束) # -wt 參數表示輸出線程的上下文切換指標 $ pidstat -wt 1 08:14:05 UID TGID TID cswch/s nvcswch/s Command ... 08:14:05 0 10551 - 6.00 0.00 sysbench 08:14:05 0 - 10551 6.00 0.00 |__sysbench 08:14:05 0 - 10552 18911.00 103740.00 |__sysbench 08:14:05 0 - 10553 18915.00 100955.00 |__sysbench 08:14:05 0 - 10554 18827.00 103954.00 |__sysbench
現在你就能看到了,雖然 sysbench 進程(也就是主線程)的上下文切換次數看起來並不多,但它的子線程的上下文切換次數卻有很多。看來,上下文切換罪魁禍首,還是過多的 sysbench 線程。
每秒上下文切換多少次纔算正常呢?
這個數值其實取決於系統本身的 CPU 性能。在我看來,如果系統的上下文切換次數比較穩定,那麼從數百到一萬以內,都應該算是正常的。
但當上下文切換次數超過一萬次,或者切換次數出現數量級的增長時,就很可能已經出現了性能問題。
這時,你還需要根據上下文切換的類型,再做具體分析。比方說:
自願上下文切換變多了,說明進程都在等待資源,有可能發生了 I/O 等其他問題;
非自願上下文切換變多了,說明進程都在被強制調度,也就是都在爭搶 CPU,說明 CPU 的確成了瓶頸;
中斷次數變多了,說明 CPU 被中斷處理程序佔用,還需要通過查看 /proc/interrupts 文件來分析具體的中斷類型。
磁盤I/O用法示例:
# -d 展示 I/O 統計數據,-p 指定進程號,間隔 1 秒輸出 3 組數據 $ pidstat -d -p 4344 1 3 06:38:50 UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command 06:38:51 0 4344 0.00 0.00 0.00 0 app 06:38:52 0 4344 0.00 0.00 0.00 0 app 06:38:53 0 4344 0.00 0.00 0.00 0 app
kB_rd/s:表示每秒讀的 KB 數
kB_wr/s: 表示每秒寫的 KB 數
iodelay: 表示 I/O 的延遲(單位是時鐘週期)