pidstat-進程性能分析工具

 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 的延遲(單位是時鐘週期)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章