性能分析時,CPU 通常是首當其中的。
uptime
可供簡單瀏覽,不推薦在需要精確度的場景使用
uptime 用于顯示當前系統(tǒng)的運行時間,用戶登錄數(shù)以及系統(tǒng)的平均負載。輸出內(nèi)容如下:
$ uptime
11:44:28 up 18 days, 23:56, 2 users, load average: 0.00, 0.06, 0.03
最后三個數(shù)字是1、5 和15 分鐘內(nèi)的平均負載。通過比較這三個數(shù)字,你可以判斷負載在15 分鐘內(nèi)(或者其他時間段)是在上升、下降,還是平穩(wěn)。
系統(tǒng)負載平均值是處于可運行或不可中斷狀態(tài)的平均進程數(shù)。 處于可運行狀態(tài)的進程要么正在使用 CPU,要么正在等待使用 CPU。 處于不可中斷狀態(tài)的進程正在等待一些 I/O 訪問,例如等待磁盤。 取三個時間間隔的平均值。 負載平均值未針對系統(tǒng)中的 CPU 數(shù)量進行標準化,因此負載平均值為 1 意味著單個 CPU 系統(tǒng)一直在加載,而在 4 CPU 系統(tǒng)上則意味著它有 75% 的時間處于空閑狀態(tài)。load average 大于CPU 數(shù)量表示CPU 不足以服務(wù)線程,有些線程在等待。如果 load average 小于CPU 數(shù)量,這(很可能)代表還有一些余量,線程可以在它們想要的時候在CPU 上運行。
Linux 目前把在不可中斷狀態(tài)執(zhí)行磁盤I/O 的任務(wù)也計入了平均負載。這意味著平均負載再也不能單用來表示CPU 余量或者飽和度,因為不能單從這個值推斷出CPU 或者磁盤負載。由于負載可能會在CPU 和磁盤之間不斷變化,比較這三個平均負載數(shù)值也變得困難了。在Linux 上最好通過一些其他的指標了解CPU 負載
vmstat
vmstat 主要是用來顯示虛擬內(nèi)存的數(shù)據(jù)。其中也包含了 CPU 的活動數(shù)據(jù)。在最后幾列打印了系統(tǒng)全局范圍的CPU 平均負載,打印如下:
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b 交換 空閑 緩沖 緩存 si so bi bo in cs us sy id wa st
0 0 177408 1014304 2606736 11480716 0 0 5 25 1 1 0 0 100 0 0
0 0 177408 1014328 2606736 11480716 0 0 0 0 85 152 0 0 100 0 0
0 0 177408 1014328 2606736 11480716 0 0 0 0 113 206 0 0 100 0 0
0 0 177408 1014328 2606736 11480716 0 0 0 0 64 142 0 0 100 0 0
0 2 177408 1014328 2606740 11480716 0 0 0 1192 77 155 0 0 100 0 0
輸出的第一行是系統(tǒng)啟動以來的總結(jié)信息,Linux 上的r 列除外——這個是顯示當前值的。
- r:可運行線程的總數(shù),在Linux 上,r 列代表所有等待的加上正在運行的線程數(shù)
- us:用戶態(tài)時間
- sy:系統(tǒng)態(tài)時間(內(nèi)核)
- id:空閑
- wa:等待I/O,即線程被阻塞等待磁盤I/O 時的CPU 空閑時間
- st:CPU 在虛擬化的環(huán)境下在其他租戶上的開銷
mpstat
顯示處理器相關(guān)數(shù)據(jù)。打印如下:
$ mpstat 1 5
Linux 4.15.0-112-generic (huya-stf-4) 2022年04月19日 _x86_64_ (12 CPU)
16時20分19秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
16時20分20秒 all 0.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.92
16時20分21秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
16時20分22秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
16時20分23秒 all 0.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.92
16時20分24秒 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
平均時間: all 0.03 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.97
選項-P ALL用來打印每個CPU 的報告。mpstat 默認只打印系統(tǒng)級別的總結(jié)信息。
- CPU:邏輯CPU ID,或者all 表示總結(jié)信息。
- %usr:用戶態(tài)時間。
- %nice:以nice 優(yōu)先級運行的進程用戶態(tài)時間。
- %sys:系統(tǒng)態(tài)時間(內(nèi)核)。
- %iowait:I/O 等待。
- %irq:硬件中斷CPU 用量。
- %soft:軟件中斷CPU 用量。
- %steal:耗費在服務(wù)其他租戶的時間。
- %guest:花在訪客虛擬機的時間。
- %idle:空閑。
sar
系統(tǒng)活動分析。打印如下:
$ sar 1 5
Linux 4.15.0-112-generic (huya-stf-4) 2022年04月19日 _x86_64_ (12 CPU)
16時30分08秒 CPU %user %nice %system %iowait %steal %idle
16時30分09秒 all 0.00 0.00 0.00 0.00 0.00 100.00
16時30分10秒 all 0.00 0.00 0.00 0.00 0.00 100.00
16時30分11秒 all 0.00 0.00 0.08 0.00 0.00 99.92
16時30分12秒 all 1.83 0.00 0.91 0.00 0.00 97.26
16時30分13秒 all 0.17 0.00 0.08 0.00 0.00 99.75
平均時間: all 0.40 0.00 0.22 0.00 0.00 99.38
當然 sar 還支持很多系統(tǒng)指標監(jiān)控,CPU只是其中一個
ps
報告當前進程的快照。屬于最常用監(jiān)控進程的命令。打印如下:
ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 215448 8324 ? Ss 3月31 1:37 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 3月31 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< 3月31 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< 3月31 0:00 [mm_percpu_wq]
Linux 上,%CPU 列顯示了在前一秒內(nèi)所有CPU 上的CPU 用量之和。一個單線程的CPU型進程會報告100%。而一個雙線程的CPU 型進程則會報告200%。
top
展示 Linux 進程信息。
top 命令監(jiān)控了運行得最多的進程,以一定間隔刷新屏幕。打印如下:
$ top
top - 16:35:34 up 19 days, 4:47, 2 users, load average: 0.00, 0.00, 0.00
任務(wù): 309 total, 1 running, 226 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16282212 total, 774464 free, 1180456 used, 14327292 buff/cache
KiB Swap: 2097148 total, 1919740 free, 177408 used. 14618152 avail Mem
進? USER PR NI VIRT RES SHR ? %CPU %MEM TIME+ COMMAND
30499 huya 20 0 31540 3952 3196 R 20.0 0.0 0:00.03 top
1 root 20 0 215448 8324 5280 S 0.0 0.1 1:37.25 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.35 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
7 root 20 0 0 0 0 S 0.0 0.0 0:00.35 ksoftirqd/0
8 root 20 0 0 0 0 I 0.0 0.0 5:20.85 rcu_sched
頂部是系統(tǒng)范圍的統(tǒng)計信息,而下面則是進程/任務(wù)的列表,默認按照CPU 用量排序。
pidstat
Linux 上的pidstat 工具按進程或線程打印CPU 用量,包括用戶態(tài)和系統(tǒng)態(tài)時間的分解。默認情況下,僅循環(huán)輸出活動進程的信息。輸出如下:
$ pidstat -p 6298 1 5
Linux 4.15.0-112-generic (huya-stf-4) 2022年04月19日 _x86_64_ (12 CPU)
16時44分33秒 UID PID %usr %system %guest %wait %CPU CPU Command
16時44分34秒 1000 6298 0.00 0.00 0.00 0.00 0.00 1 bash
16時44分35秒 1000 6298 0.00 0.00 0.00 0.00 0.00 1 bash
16時44分36秒 1000 6298 0.00 0.00 0.00 0.00 0.00 1 bash
16時44分37秒 1000 6298 0.00 0.00 0.00 0.00 0.00 1 bash
16時44分38秒 1000 6298 0.00 0.00 0.00 0.00 0.00 1 bash
平均時間: 1000 6298 0.00 0.00 0.00 0.00 0.00 - bash
time
運行程序并總結(jié)系統(tǒng)資源使用情況。舉例如下:
$ /usr/bin/time -v cp squid.tgz squid2.tgz
Command being timed: "cp squid.tgz squid2.tgz"
User time (seconds): 0.00
System time (seconds): 0.03
Percent of CPU this job got: 65%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.04
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 2736
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 149
Voluntary context switches: 3
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 60088
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
選項-v 一般不在shell 內(nèi)建版中提供,需要通過絕對路徑調(diào)用
perf
Linux 性能分析工具。Linux 的性能計數(shù)器是一個新的基于內(nèi)核的子系統(tǒng),它為所有事物的性能分析提供了一個框架。 它還涵蓋了硬件級別(CPU/PMU、性能監(jiān)控單元)功能和軟件功能(軟件計數(shù)器、跟蹤點)。命令選項如下:
