Linux 效能最佳化工具包 sysstat

厚礼蝎發表於2024-03-15

簡介

Sysstat 是一套在Linux系統中廣泛使用的效能監控工具集,主要用於收集和分析系統的各種效能統計資訊。它包含了多個命令列工具,這些工具能夠幫助系統管理員和開發人員實時或週期性地監控伺服器的CPU使用率、記憶體使用、磁碟I/O、網路流量以及其他重要的系統資源指標。

主要包含的工具如下:

  1. sar (System Activity Reporter):用於報告系統的CPU、記憶體、程序、I/O裝置以及網路等資源的利用率和統計資料。可以生成實時報告,也可以讀取先前記錄的日誌檔案生成歷史報告。

  2. iostat:用於監視系統的中央處理器(CPU)使用情況以及磁碟操作的統計資訊,包括每塊硬碟的讀寫運算元、資料量和延遲時間等。

  3. mpstat:多處理器狀態監控工具,用於顯示每個CPU核心的活動以及整個系統的平均CPU負載。

  4. pidstat:用來監控程序級別的CPU、記憶體、I/O和上下文切換等資源使用情況。

  5. sadc:sysstat資料收集器,負責根據配置定期收集系統效能資料並儲存到日誌檔案中。

  6. sarstat:此命令可能存在於某些舊版本的sysstat包中,但現在通常由sar命令代替,用於處理和展示sadc收集的資料。

  7. sadf:用來讀取由 sadc 收集並儲存的資料,並以多種格式(例如CSV、XML或JSON)顯示這些資料。它允許使用者檢視歷史效能報告,分析系統過去的資源利用情況,以及生成視覺化圖表(如SVG)來更好地理解系統的負載變化趨勢。

  8. vmstat:用於報告虛擬記憶體統計資訊,如程序、記憶體、paging、block IO、CPU 活動等。它可以幫助你監控系統的效能和資源使用情況。

Sysstat可以透過cron任務定時收集系統統計資訊,並將其儲存在 /var/log/sa/ 或者 /var/log/sysstat 目錄下的每日日誌檔案中。這些資料對於長期趨勢分析和系統瓶頸排查非常有用。透過配置/etc/sysconfig/sysstat/etc/default/sysstat(根據不同Linux發行版),可以定製sysstat的收集頻率和日誌保留策略。

安裝

sysstat 是一個用於監控系統效能的工具集,包括 iostatmpstatpidstatsar 等工具。要在不同的作業系統上安裝 sysstat,請按照以下說明進行操作:

對於基於 Debian 的系統(如 Ubuntu):

sudo apt-get update
sudo apt-get install sysstat

對於基於 RHEL 的系統(如 CentOS、Fedora):

sudo yum install sysstat

sar命令

sar命令很強大,是分析系統效能的重要工具之一

透過sar指令,可以全面的獲取系統的CPU、執行佇列、磁碟I/O、分頁(交換區)、記憶體、CPU中斷、網路等效能資料。

sar使用格式為:

sar [options] [-o filename] [interval [count] ]

各個選項及引數含義如下:

options 為命令列選項

sar命令的選項很多,下面只列出常用選項:

  • -A:顯示系統所有資源裝置(CPU、記憶體、磁碟)的執行狀況。

  • -u:顯示系統所有CPU在取樣時間內的負載狀態。預設

  • -P:顯示當前系統中指定CPU的使用情況。

  • -d:顯示系統所有硬碟裝置在取樣時間內的使用狀況。

  • -r:顯示系統記憶體在取樣時間內的使用狀況。

  • -b:顯示緩衝區在取樣時間內的使用情況。

  • -v:顯示程序、檔案、I節點和鎖表狀態。

  • -n:顯示網路執行狀態。引數後面可跟DEV、EDEV、SOCK和FULL。DEV顯示網路介面資訊,EDEV顯示網路錯誤的統計資料,SOCK顯示套接字資訊,FULL顯示三個所有的資訊。它們可以單獨或者一起使用。

  • -q:顯示執行列表中的程序數、程序大小、系統平均負載等

  • interval:表示取樣間隔時間,是必須有的引數。

  • count:表示取樣次數,是可選引數,預設值是1。

CPU使用情況

$ sar -u 3 5 #檢視系統 CPU 的整理負載狀況,每 3 秒統計一次,統計 5 次
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

21時00分58秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
21時01分01秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時01分04秒     all      0.00      0.00      0.33      0.00      0.00     99.67
21時01分07秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時01分10秒     all      0.00      0.00      0.00      0.00      0.00    100.00
21時01分13秒     all      0.00      0.00      0.00      0.00      0.00    100.00
平均時間:     all      0.00      0.00      0.07      0.00      0.00     99.93

$ sar -P 0 #0號cpu的負載情況
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

20時00分16秒       LINUX RESTART

20時10分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
20時20分01秒       0      0.01      0.00      0.07      0.00      0.00     99.93
20時30分01秒       0      0.21      0.00      0.19      0.01      0.00     99.59
20時40分01秒       0      0.00      0.00      0.07      0.00      0.00     99.93
20時50分01秒       0      0.00      0.00      0.07      0.00      0.00     99.93
21時00分01秒       0      0.00      0.00      0.07      0.00      0.00     99.93
21時10分01秒       0      0.00      0.00      0.07      0.00      0.00     99.93
平均時間:       0      0.04      0.00      0.09      0.00      0.00     99.87

輸出說明

  • %user:用於表示使用者模式下消耗的 CPU 時間的比例;
  • %nice:透過 nice 改變了程序排程優先順序的程序,在使用者模式下消耗的 CPU 時間的比例;
  • %system:系統模式下消耗的 CPU 時間的比例;
  • %iowait:CPU 等待磁碟 I/O 導致空閒狀態消耗的時間比例;
  • %steal:虛擬機器偷走的時間比例;
  • %idle:CPU 空閒時間比例。

塊使用情況

$ sar -d 3 2 #檢視每個塊的讀寫效能 3秒一次 統計2次
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

21時03分52秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
21時03分55秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時03分55秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

21時03分55秒       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
21時03分58秒   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時03分58秒    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

平均時間:       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
平均時間:   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
  • tps: 每秒程序下發的IO讀、寫請求數量
  • rd_sec/s: 每秒讀取扇區的次數
  • wr_sec/s:每秒寫扇區的次數;
  • avgrq-sz:平均每次裝置 I/O 操作的資料大小(扇區);
  • avgqu-sz:磁碟請求佇列的平均長度;
  • await:從請求磁碟操作到系統完成處理,每次請求的平均消耗時間,包括請求佇列等待時間,單位是毫秒(1 秒=1000 毫秒);
  • svctm:系統處理每次請求的平均時間,不包括在請求佇列中消耗的時間;
  • %util:I/O 請求佔 CPU 的百分比,比率越大,說明越飽和。

記憶體使用情況

$ sar -r
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

20時00分16秒       LINUX RESTART

20時10分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
20時20分01秒   1559432    468424     23.10      2104    151744    812788     13.06    103848    118948         0
20時30分01秒   1450660    577196     28.46      2104    256724    812788     13.06    189196    138544         0
20時40分01秒   1450768    577088     28.46      2104    256728    812788     13.06    189212    138540         4
20時50分01秒   1451036    576820     28.44      2104    256700    812248     13.05    189040    138524         4
21時00分01秒   1451292    576564     28.43      2104    256812    812248     13.05    189044    138632         0
21時10分01秒   1451208    576648     28.44      2104    256820    812248     13.05    189044    138568         0
平均時間:   1469066    558790     27.56      2104    239255    812518     13.06    174897    135293         1
  • kbmemfree 剩餘記憶體總量
  • kbmemused 使用的記憶體總量,使用量=總記憶體-剩餘記憶體-buffer-cache-slab
  • %memused 已使用記憶體的佔比
  • kbbuffers 被核心用來作為buffer的記憶體量
  • kbcached 被核心用來作為cache的記憶體量
  • kbcommit 當前工作負載下,可以保證不出現記憶體不足的記憶體量
  • %commit 指kbcommit佔記憶體/swap的百分率
  • kbactive 當前活躍記憶體量。除非萬不得已,這部分記憶體才會被回收
  • kbinact 當前非活躍記憶體總量,當記憶體不足時,這部分記憶體最容易被核心收回
  • kbdirty 髒頁大小,髒頁指的是暫存於記憶體還沒來得及持久化到硬碟的資料。可以使用sync刷入硬碟

磁碟I/O和傳送速率監控

$ sar -b
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

20時00分16秒       LINUX RESTART

20時10分01秒       tps      rtps      wtps   bread/s   bwrtn/s
20時20分01秒      0.09      0.00      0.09      0.05      1.19
20時30分01秒      1.58      1.00      0.58     93.72    264.15
20時40分01秒      0.11      0.00      0.11      0.00      3.54
20時50分01秒      0.07      0.00      0.07      0.00      0.93
21時00分01秒      0.04      0.00      0.03      0.36      0.42
21時10分01秒      0.11      0.00      0.11      0.00      1.59
21時20分01秒      0.02      0.00      0.02      0.00      0.29
平均時間:      0.29      0.14      0.15     13.45     38.87
  • tps 每秒鐘物理裝置的 I/O 傳輸總量
  • rtps 每秒鐘從物理裝置讀入的資料總量
  • wtps 每秒鐘向物理裝置寫入的資料總量
  • bread/s 每秒鐘從物理裝置讀入的資料量,單位為 塊/s 塊的大小等同於一個扇區的大小,512位元組
  • bwrtn/s 每秒鐘向物理裝置寫入的資料量,單位為 塊/s

inode、檔案和其他核心表監控

$ sar -v
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

20時00分16秒       LINUX RESTART

20時10分01秒 dentunusd   file-nr  inode-nr    pty-nr
20時20分01秒     47663      2048     58549         1
20時30分01秒     49873      2080     58855         1
20時40分01秒     49873      2048     58849         1
20時50分01秒     49882      2048     58830         1
21時00分01秒     49908      2048     58834         1
21時10分01秒     49920      2048     58834         1
21時20分01秒     49927      2048     58834         1
平均時間:     49578      2053     58798         1
  • dentunusd 目錄快取記憶體中未被使用的條目數量
  • file-nr 系統使用的檔案控制代碼數
  • inode-nr 系統使用的inode處理程式數
  • pty-nr 開啟的偽終端數,即幾個人登陸了系統

對網路的監控

sar -n { <關鍵詞> [,...] | ALL }
網路統計資訊
關鍵詞可以是:

  • DEV 網路卡
  • EDEV 網路卡 (錯誤)
  • NFS NFS 客戶端
  • NFSD NFS 伺服器
  • SOCK Sockets (套接字) (v4)
  • IP IP 流 (v4)
  • EIP IP 流 (v4) (錯誤)
  • ICMP ICMP 流 (v4)
  • EICMP ICMP 流 (v4) (錯誤)
  • TCP TCP 流 (v4)
  • ETCP TCP 流 (v4) (錯誤)
  • UDP UDP 流 (v4)
  • SOCK6 Sockets (套接字) (v6)
  • IP6 IP 流 (v6)
  • EIP6 IP 流 (v6) (錯誤)
  • ICMP6 ICMP 流 (v6)
  • EICMP6 ICMP 流 (v6) (錯誤)
  • UDP6 UDP 流 (v6)
$ sar -n DEV 2 2
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

21時28分33秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
21時28分35秒     ens37      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分35秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分35秒 virbr0-nic      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分35秒    virbr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分35秒     ens33      0.00      0.00      0.00      0.00      0.00      0.00      0.00

21時28分35秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
21時28分37秒     ens37      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分37秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分37秒 virbr0-nic      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分37秒    virbr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
21時28分37秒     ens33      0.50      0.50      0.03      0.33      0.00      0.00      0.00

平均時間:     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
平均時間:     ens37      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間: virbr0-nic      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:    virbr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00
平均時間:     ens33      0.25      0.25      0.01      0.16      0.00      0.00      0.00

程序佇列長度和平均負載狀態監控

$ sar -q
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

20時00分16秒       LINUX RESTART

20時10分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
20時20分01秒         0       178      0.00      0.01      0.04         0
20時30分01秒         0       179      0.00      0.01      0.05         0
20時40分01秒         0       178      0.00      0.01      0.05         0
20時50分01秒         0       178      0.04      0.03      0.05         0
21時00分01秒         0       177      0.00      0.01      0.05         0
21時10分01秒         0       177      0.00      0.01      0.05         0
21時20分01秒         0       177      0.00      0.01      0.05         0
21時30分01秒         0       177      0.00      0.01      0.05         0
平均時間:         0       178      0.01      0.01      0.05         0
  • runq-sz 執行佇列的長度(等待執行的程序數,等待cpu排程的任務數)
  • plist-sz 程序列表中程序(processes)和執行緒(threads)的數量
  • ldavg-1 最後1分鐘的系統平均負載(System load average)
  • ldavg-5 過去5分鐘的系統平均負載
  • ldavg-15 過去15分鐘的系統平均負載
  • blocked 表示等待I/O完成而被阻塞的任務總數,不為0則需要留意I/O是否存在效能瓶頸

iostat命令

iostat是I/O statistics(輸入/輸出統計)的縮寫

主要的功能是對系統的磁碟I/O操作進行監視

它的輸出主要顯示磁碟讀寫操作的統計資訊,同時也會給出CPU使用情況

iostat使用語法如下:

iostat [ -c | -d ] [ -k ] [ -t ] [ -x [ device ] ] [ interval [ count ] ]

各個選項及引數含義如下:

  • -c:顯示CPU的使用情況。

  • -d:顯示磁碟的使用情況。

  • -k/-m:每秒以k bytes/m bytes為單位顯示資料。

  • -t:列印出統計資訊開始執行的時間。

  • -p:顯示每塊磁碟的分割槽情況

  • -N:顯示磁碟陣列(LVM)資訊

  • -x device:指定要統計的磁碟裝置名稱,預設為所有的磁碟裝置。

  • interval:指定兩次統計間隔的時間;

  • count:按照“interval”指定的時間間隔統計的次數。

$ iostat  #從開機到當前時刻的統計資訊
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.25    0.01    0.00   99.63

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.01         0.56         0.00       1038          0
sda               6.60       136.46        57.60     250973     105947

輸出的說明

  • 第一行:分別是版本核心資訊 日期 架構 cpu個數
  • avg-cpu部分:
    • %user:使用者佔用cpu的時間百分比
    • %nice:有優先順序的程序佔用cpu的時間百分比
    • %system:系統佔用cpu時間百分比
    • %iowait:等待IO時間的時間百分比
    • %steal:管理程式維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比
    • %idle:CPU空閒時間百分比

當然了,iostat命令的重點不是用來看CPU的,重點是用來監測磁碟效能的。

  • Device部分
    • tps: 每秒程序下發的IO讀、寫請求數量
    • kB_read/s: 每秒從磁碟讀入的資料量,單位為K。
    • kB_wrtn/s: 每秒從磁碟寫入的資料量,單位為K。
    • kB_read: 讀取的資料總量,單位為K。
    • KB_wrtn: 寫入的資料總量,單位為K。
$ iostat -x -k -d 1 2 # 每隔1S輸出磁碟IO的詳細詳細,總共取樣2次
Linux 3.10.0-1160.62.1.el7.x86_64 (Centos7.9-0.5) 	2022年05月14日 	_x86_64_	(2 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.01    0.00     0.58     0.00    90.26     0.00    1.13    1.13    0.00   0.96   0.00
sda               0.02     0.04    6.25    0.51   140.25    58.74    58.89     0.00    0.30    0.25    0.84   0.20   0.13

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

輸出說明

  • rrqm/s: 每秒對該裝置的讀請求被合併次數,檔案系統會對讀取同塊(block)的請求進行合併

  • wrqm/s: 每秒對該裝置的寫請求被合併次數

  • r/s: 每秒完成的讀次數

  • w/s: 每秒完成的寫次數

  • rkB/s: 每秒讀資料量(kB為單位)

  • wkB/s: 每秒寫資料量(kB為單位)

  • avgrq-sz:平均每次裝置I/O操作的資料大小(扇區數為單位)

  • avgqu-sz: 平均I/O佇列長度

  • await:平均每次裝置I/O操作的等待時間 (毫秒),一般地,系統I/O響應時間應該低於5ms,如果大於 10ms就比較大了

  • r_await: 每個讀操作平均所需的時間;不僅包括硬碟裝置讀操作的時間,還包括了在kernel佇列中等待的時間

  • w_await: 每個寫操作平均所需的時間;不僅包括硬碟裝置寫操作的時間,還包括了在kernel佇列中等待的時間 單位毫秒

  • svctm: 平均每次IO請求的處理時間(毫秒為單位)

  • %util: 一秒中有百分之多少的時間用於I/O操作,即被IO消耗的CPU百分比,一般地,如果該引數是100%表示裝置已經接近滿負荷執行了

mpstat命令

mpstat 是一個在 Linux 系統中用於實時監控多處理器系統(包括單核和多核系統)CPU使用情況的命令列工具。

基本語法

mpstat [選項] [間隔時間 [取樣次數]

常用選項

  • -P ALL-P <cpu編號>:顯示所有CPU或指定編號CPU的統計資訊。
  • -u:顯示CPU利用率統計資料,包括使用者、系統、空閒、等待I/O等時間百分比。
  • -p:顯示每個CPU核心的中斷統計資訊。
  • -I { SUM | CPU | SCPU | ALL }:顯示詳細的CPU中斷統計。

顯示CPU的總體情況

$ mpstat
Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時26分17秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時26分17秒  all    0.05    0.00    0.08    0.00    0.00    0.00    0.00    0.00    0.00   99.86

顯示當前所有CPU的CPU利用率

$ mpstat -P ALL
Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時29分20秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時29分20秒  all    0.05    0.00    0.08    0.00    0.00    0.00    0.00    0.00    0.00   99.87
17時29分20秒    0    0.07    0.00    0.08    0.00    0.00    0.00    0.00    0.00    0.00   99.84
17時29分20秒    1    0.06    0.00    0.08    0.00    0.00    0.00    0.00    0.00    0.00   99.86
17時29分20秒    2    0.04    0.00    0.10    0.00    0.00    0.01    0.00    0.00    0.00   99.85
17時29分20秒    3    0.05    0.00    0.07    0.00    0.00    0.01    0.00    0.00    0.00   99.87
17時29分20秒    4    0.04    0.00    0.07    0.00    0.00    0.00    0.00    0.00    0.00   99.89
17時29分20秒    5    0.04    0.00    0.07    0.00    0.00    0.00    0.00    0.00    0.00   99.88
17時29分20秒    6    0.05    0.00    0.09    0.00    0.00    0.00    0.00    0.00    0.00   99.86
17時29分20秒    7    0.05    0.00    0.08    0.00    0.00    0.00    0.00    0.00    0.00   99.87

顯示當前每個CPU的CPU利用率

mpstat -I SCPU
Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時31分06秒  CPU       HI/s    TIMER/s   NET_TX/s   NET_RX/s    BLOCK/s BLOCK_IOPOLL/s  TASKLET/s    SCHED/s  HRTIMER/s      RCU/s
17時31分06秒    0       0.00      11.88       0.00       0.51       1.08       0.00       0.01       8.16       0.00       5.63
17時31分06秒    1       0.00       8.23       0.00       0.00       0.08       0.00       0.00       4.24       0.00       4.68
17時31分06秒    2       0.00      11.00       0.00       0.81       0.13       0.00       0.00       8.66       0.00       3.60
17時31分06秒    3       0.00      12.39       0.00       0.82       0.16       0.00       0.00       8.20       0.00       4.52
17時31分06秒    4       0.00      10.04       0.20       1.34       0.23       0.00       0.00       8.66       0.00       3.15
17時31分06秒    5       0.00       8.58       0.00       0.01       0.30       0.00       0.00       7.27       0.00       2.56
17時31分06秒    6       0.00      13.89       0.00       0.39       0.24       0.00       0.13      10.44       0.00       4.70
17時31分06秒    7       0.00      15.57       0.00       0.39       0.25       0.00       0.00      11.86       0.00       5.01

每隔5秒輸出一次CPU狀態,總共輸出3次

mpstat 5 3

顯示特定CPU(例如CPU0)的狀態

mpstat -P 0
Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時32分17秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17時32分17秒    0    0.07    0.00    0.08    0.00    0.00    0.00    0.00    0.00    0.00   99.84

pidstat命令

pidstat是程序分析的終極利器,利用它可以分析程序(包括程序中所有每個執行緒)的各種資訊:

cpu使用(預設就是cpu, -u 也是cpu), 記憶體使用(-r 包括page fault),IO情況(-d),程序切換(-w),

pidstat 可以使用 -p xxx 指定程序pid,單獨分析一個程序及其所有執行緒;也可以是所有程序 -p ALL,或者是所有活動程序(預設是所有活動程序)

基本語法

pidstat [選項] [間隔時間] [取樣次數]

選項

  • -d 顯示各程序磁碟IO統計資訊。
  • -h 時間會以時間戳的方式顯示
  • -l 會完整的顯示各程序
  • -r 顯示各程序記憶體使用情況
  • -s 顯示程序的記憶體堆疊使用情況
  • -t 以樹的形式展示各程序
  • -U [ <username> ] 只展示該使用者的相關程序
  • -u 展示每個程序的CPU利用率 預設選項
  • -w 顯示程序的上下文切換(Context Switches)統計資訊
  • -C <command> 只顯示相關程序名稱的程序
  • -p <pid> 顯示pid對應的程序

檢視所有活動程序的cpu資訊

$ pidstat 

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時35分49秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時35分49秒     0         1    0.00    0.02    0.00    0.02     2  systemd
17時35分49秒     0         2    0.00    0.00    0.00    0.00     6  kthreadd
17時35分49秒     0         6    0.00    0.00    0.00    0.00     0  ksoftirqd/0
17時35分49秒     0         7    0.00    0.00    0.00    0.00     0  migration/0
17時35分49秒     0         9    0.00    0.02    0.00    0.02     6  rcu_sched
17時35分49秒     0        11    0.00    0.00    0.00    0.00     0  watchdog/0
17時35分49秒     0        12    0.00    0.00    0.00    0.00     1  watchdog/1
17時35分49秒     0        13    0.00    0.00    0.00    0.00     1  migration/1
17時35分49秒     0        17    0.00    0.00    0.00    0.00     2  watchdog/2
17時35分49秒     0        18    0.00    0.00    0.00    0.00     2  migration/2


$ pidstat -h

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

#      Time   UID       PID    %usr %system  %guest    %CPU   CPU  Command
 1710496372     0         1    0.00    0.02    0.00    0.02     2  systemd
 1710496372     0         2    0.00    0.00    0.00    0.00     6  kthreadd
 1710496372     0         6    0.00    0.00    0.00    0.00     0  ksoftirqd/0
 1710496372     0         7    0.00    0.00    0.00    0.00     0  migration/0
 1710496372     0         9    0.00    0.02    0.00    0.02     7  rcu_sched
 1710496372     0        11    0.00    0.00    0.00    0.00     0  watchdog/0
 1710496372     0        12    0.00    0.00    0.00    0.00     1  watchdog/1
 1710496372     0        13    0.00    0.00    0.00    0.00     1  migration/1

顯示各程序的磁碟IO情況

$ pidstat -d

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時54分21秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17時54分21秒     0         1     13.99      0.02      0.00  systemd
17時54分21秒     0        78      0.00      0.00      0.00  kworker/u256:1
17時54分21秒     0       306      0.00      0.00      0.00  kworker/u256:2
17時54分21秒     0       440      0.12      0.00      0.00  systemd-journal
17時54分21秒     0       460      0.01      0.00      0.00  lvmetad
17時54分21秒     0       480      2.06      0.00      0.00  systemd-udevd
17時54分21秒     0       611      0.01      0.00      0.00  xfsaild/sda5
17時54分21秒     0       648      0.01      0.04      0.00  auditd
17時54分21秒     0       650      0.01      0.00      0.00  audispd

完整顯示各程序名稱

$ pidstat -l

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時55分08秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時55分08秒     0         1    0.00    0.02    0.00    0.02     2  /usr/lib/systemd/systemd --switched-root --system --deserialize 22 
17時55分08秒     0       314    0.00    0.00    0.00    0.00     0  irq/16-vmwgfx
17時55分08秒     0       354    0.00    0.07    0.00    0.07     3  xfsaild/sda2
17時55分08秒     0       440    0.00    0.00    0.00    0.00     5  /usr/lib/systemd/systemd-journald 
17時55分08秒     0       458    0.00    0.00    0.00    0.00     7  kworker/7:2
17時55分08秒     0       480    0.01    0.00    0.00    0.01     0  /usr/lib/systemd/systemd-udevd 
17時55分08秒     0       575    0.00    0.07    0.00    0.07     2  kworker/2:2
17時55分08秒     0       611    0.00    0.07    0.00    0.07     7  xfsaild/sda5
17時55分08秒     0       648    0.00    0.00    0.00    0.00     6  /sbin/auditd 
17時55分08秒     0       650    0.00    0.00    0.00    0.00     6  /sbin/audispd 
17時55分08秒     0       652    0.00    0.00    0.00    0.00     7  /usr/sbin/sedispatch 
17時55分08秒    32       678    0.00    0.00    0.00    0.00     6  /sbin/rpcbind -w 
17時55分08秒     0       681    0.00    0.00    0.00    0.00     5  /usr/sbin/gssproxy -D 
17時55分08秒     0       688    0.00    0.00    0.00    0.00     7  /usr/sbin/ModemManager 
17時55分08秒     0       694    0.00    0.00    0.00    0.01     1  /usr/sbin/irqbalance --foreground 
17時55分08秒     0       697    0.00    0.00    0.00    0.00     0  /usr/sbin/smartd -n -q never 

顯示各程序記憶體使用情況

$ pidstat -r

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時56分24秒   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
17時56分24秒     0         1      2.21      0.01  191648   4628   0.06  systemd
17時56分24秒     0       440      0.60      0.00   39160   4200   0.05  systemd-journal
17時56分24秒     0       460      0.06      0.00  116644   1272   0.02  lvmetad
17時56分24秒     0       480      0.36      0.00   46284   2612   0.03  systemd-udevd
17時56分24秒     0       648      0.02      0.00   55532    860   0.01  auditd
17時56分24秒     0       650      0.03      0.00   84556    920   0.01  audispd
17時56分24秒     0       652      0.05      0.00   55620   1432   0.02  sedispatch
17時56分24秒    32       678      0.02      0.00   69256   1008   0.01  rpcbind
17時56分24秒     0       681      0.04      0.00  201428   1276   0.02  gssproxy
17時56分24秒     0       688      0.18      0.01  430628   7544   0.09  ModemManager
17時56分24秒     0       694      0.29      0.00   21692   1328   0.02  irqbalance
17時56分24秒     0       697      0.11      0.00   52852   2816   0.03  smartd
17時56分24秒     0       698      0.10      0.00   26384   1776   0.02  systemd-logind
17時56分24秒     0       708      0.11      0.00   90668   3236   0.04  rngd

只顯示指定使用者的相關程序

$ pidstat -U chrony

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時57分37秒     USER       PID    %usr %system  %guest    %CPU   CPU  Command
17時57分37秒   chrony       734    0.00    0.00    0.00    0.00     4  chronyd

只顯示匹配到名稱的程序

$ pidstat -C ssh

Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時58分43秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時58分43秒     0      2964    0.00    0.01    0.00    0.01     4  sshd
17時58分43秒     0      2968    0.00    0.00    0.00    0.00     5  sshd
17時58分43秒     0      3260    0.00    0.00    0.00    0.00     4  sshd
17時58分43秒     0      3264    0.00    0.00    0.00    0.00     4  sshd

根據PID顯示

pidstat -p 2964
Linux 3.10.0-1160.92.1.el7.x86_64 (centos7912) 	2024年03月15日 	_x86_64_	(8 CPU)

17時59分34秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
17時59分34秒     0      2964    0.00    0.01    0.00    0.01     4  sshd

vmstat命令

vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫

可以對作業系統的記憶體資訊、程序狀態、CPU活動等進行監視

vmstat使用語法如下:

vmstat [-V] [-n] [delay [count]]

各個選項及引數含義如下:

  • -a:顯示活躍和非活躍記憶體

  • -f:顯示從系統啟動至今的fork數量。

  • -V:表示列印出版本資訊,是可選引數。

  • -n:表示在週期性迴圈輸出時,輸出的頭部資訊僅顯示一次。

  • -d:顯示磁碟相關統計資訊。

  • delay:表示兩次輸出之間的間隔時間。

  • count:表示按照“delay”指定的時間間隔統計的次數。預設為1。

例如:

vmstat 3

表示每3秒鐘更新一次輸出資訊,迴圈輸出,按ctrl+c停止輸出。

vmstat 3 5

表示每3秒更新一次輸出資訊,統計5次後停止輸出。

$ vmstat 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1662312   2104 169148    0    0   300    32  117  250  0  1 98  0  0
$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1662156   2104 169188    0    0   278    30  112  235  0  1 99  0  0
 0  0      0 1662156   2104 169188    0    0     0     0  103  123  0  0 100  0  0
 0  0      0 1662156   2104 169188    0    0     0     0  105  128  0  0 100  0  0
 0  0      0 1662156   2104 169188    0    0     0     0   93  111  0  0 100  0  0
 0  0      0 1662156   2104 169188    0    0     0     0   94  109  0  0 100  0  0

各欄位說明

Procs(程序):

  • r: 執行佇列中程序數量
  • b: 等待IO的程序數量

Memory(記憶體):

  • swpd: 使用虛擬記憶體大小
  • free: 可用記憶體大小
  • buff: 用作緩衝的記憶體大小
  • cache: 用作快取的記憶體大小

Swap(虛擬記憶體):

  • si(換⼊):每秒從SWAP(交換分割槽)讀⼊到RAM(swap in)的⼤⼩,單位是KB
  • so(換出):每秒從RAM寫出到SWAP(swap out)的大小,單位是KB

IO:(現在的Linux版本塊的大小為1024bytes)

  • bi: 每秒從檔案系統或SWAP讀⼊到RAM(blocks in)的塊數,block(1KB磁碟塊)為單位
  • bo: 每秒從RAM寫出到檔案系統或SWAP(blocks out)的塊數,block(1KB磁碟塊)為單位

system(系統):

  • in: 每秒中斷數,包括時鐘中斷。
  • cs: 系統每秒上下文切換數。

CPU(以百分比表示):

  • us: 使用者佔用cpu的時間百分比(user time)
  • sy: 系統佔用cpu時間百分比(system time)
  • id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 。以百分比表示。
  • wa: 等待IO時間的時間百分比
  • st:被虛擬機器偷走的cpu時間的百分比

相關文章