CPU 負載與 CPU 使用率可不是一回事
原文: https://www.baeldung.com/linux/get-cpu-usage
1、簡介
存儲、內存和 CPU(中央處理器)等系統資源不足會極大地影響應用程序的性能。因此,監控這些組件至關重要。
與磁盤和內存不同,監控 Linux 系統上的 CPU 使用率並不那麼簡單。在本文中,我們將瞭解如何解釋 CPU 指標並以人類可讀的格式顯示它們。
2. CPU 負載與 CPU 使用率
儘管 CPU 負載和 CPU 使用率聽起來很相似,但它們是不可互換的。CPU 負載定義爲在單個時間點使用或等待使用一個內核的進程數。
假設我們有一個單核系統,我們的 CPU 平均負載始終低於 0.6。這表明每個需要使用 CPU 的進程都可以立即使用它,而無需等待。如果 CPU 平均負載大於 1,則表示有進程需要使用 CPU,但由於 CPU 不可用,目前無法使用。
但是,多處理器系統中高於 1 的平均負載不會成爲問題,因爲有更多內核可用。
uptime 命令爲我們提供了以 1、5 和 15 分鐘爲間隔的平均負載視圖:
[root@localhost ~]# uptime
12:40:05 up 2:29, 1 user, load average: 0.37, 0.08, 0.03
如果不知道系統的核心數,就無法解釋平均負載:
[root@localhost ~]# cat /proc/cpuinfo |grep core
core id : 0
cpu cores : 1
另一方面,CPU 使用率是 CPU 處理非空閒任務所花費的時間百分比。CPU 使用率只能在指定的時間間隔內測量。我們可以通過將空閒時間的百分比從 100 中減去來確定 CPU 使用率。微信搜索公衆號:架構師指南,回覆:架構師 領取資料 。
3. 計算 CPU 使用率
3.1 使用 vmstat 獲取 CPU 使用率
vmstat 命令近乎實時地顯示 CPU 活動:
[root@localhost ~]# vmstat 3 4
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 1347080 6120 941464 0 0 68 11 72 137 1 2 97 0 0
1 0 0 1347080 6120 941464 0 0 0 0 84 157 1 2 97 0 0
1 0 0 1347080 6120 941464 0 0 0 0 59 107 1 1 98 0 0
1 0 0 1347080 6120 941464 0 0 0 1 59 104 1 1 98 0 0
CPU 下的列提供了處理器時間花費在哪裏的概覽:
us –運行非內核代碼所花費的時間
sy - 運行內核代碼所花費的時間
id –空閒時間
wa –等待 I/O 所花費的時間
st - 從虛擬機中竊取時間
id 列是我們感興趣的。延遲一秒,我們使用 vmstat 計算 CPU 使用率:
[root@localhost ~]# echo "CPU Usage: "$[100-$(vmstat 1 2|tail -1|awk '{print $15}')]"%"
CPU Usage: 2%
沒有提供任何參數的 vmstat 命令將給出自引導以來的 CPU 時間。這不會提供準確的 CPU 使用百分比。因此,參數只能是 1 和 2,我們採用一秒鐘後計算的指標:
vmstat 1 2
3.2. 使用 / proc/stat 獲取 CPU 使用率
CPU 活動也可以從 / proc/stat 文件中提取。該文件包含自啓動以來有關係統的各種指標:
[root@localhost ~]# cat /proc/stat
cpu 3020 28 1863 22404 35 432 47 0 0 0
cpu0 3020 28 1863 22404 35 432 47 0 0 0
intr 96468 28 100 0 0 0 0 0 0 1 0 0 0 1263 0 0 0 3696 0 153 928 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 207 0 41 14600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 343 97 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 340950
btime 1628404433
processes 3276
procs_running 2
procs_blocked 0
softirq 112867 1 16857 56 269 510 0 261 0 0 94913
第一行, 'cpu' 是系統所有核心指標的聚合。在具有 4 個內核的系統上,將有 4 條 cpu 線——cpu0、cpu1、cpu2 和 cpu3。'cpu' 行中的列表示處理不同任務所花費的時間:
user – 在用戶模式下花費的時間
nice – 在用戶模式下處理 nice 進程所花費的時間
system – 執行內核代碼所花費的時間
idle - 空閒時間
iowait – 等待 I/O 所花費的時間
irq - 服務中斷所花費的時間
softirq – 服務軟件中斷所花費的時間
steal —從虛擬機中竊取的時間
guest - 爲來賓操作系統運行虛擬 CPU 所花費的時間
guest_nice – 爲 “不錯的” 客戶操作系統運行虛擬 CPU 所花費的時間
我們將使用這些指標來計算平均空閒百分比。隨後,我們將使用計算值來計算 CPU 使用率。需要注意的是,較舊的 Linux 發行版不計算竊取、來賓或來賓_nice 指標。如果我們使用的是舊系統,我們會在計算中忽略這些指標:
平均空閒時間 (%) = (idle * 100) / (user + nice + system + idle + iowait + irq + softirq +steal + guest + guest_nice)
cat /proc/stat |grep cpu |tail -1|awk '{print ($5*100)/($2+$3+$4+$5+$6+$7+$8+$9+$10)}'|awk '{print "CPU Usage: " 100-$1}'
CPU Usage: 2.4219
由於我們正在開發單核系統,因此 “cpu” 行將與 “cpu1 ” 相同。因此,tail -1 的使用是 只檢索其中一行。然而,我們會在多處理器系統上使用 “ cpu ” 行,因爲它是所有內核上的指標的集合。
3.3. 使用 top 獲取 CPU 使用率
通常,top 命令通常用於顯示系統上的活動進程以及這些進程消耗了多少資源。不過,我們可以使用這個命令來測量 CPU 的狀態:
[root@localhost ~]# top
top - 07:08:31 up 2:41, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 322 total, 2 running, 320 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.0 us, 15.0 sy, 0.0 ni, 97.8 id, 0.0 wa, 5.0 hi, 0.0 si, 0.0 st
MiB Mem : 3709.4 total, 1483.1 free, 1402.0 used, 824.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2053.4 avail Mem
此外,需要注意的是,top 命令顯示了單個內核的 CPU 百分比。在多處理器系統中,CPU 百分比可能超過 100%。例如,如果 4 個核心爲 75%,top 命令將顯示 CPU 爲 300%。
我們需要獲取空閒時間的值,以便我們可以從 100 中減去它來獲得使用情況:
[root@localhost ~]# top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'|awk '{print "CPU Usage: " 100-$8 "%"}'
CPU Usage: 2.2%
-n 選項是 top 命令在結束前應該使用的迭代次數。我們避免使用第一個循環,因爲我們檢索的指標將是自啓動以來的值。因此,我們進行了第二次迭代。
或者,在多處理器系統中,我們必須將給定的 “id” 值除以內核數,然後從 100 中減去該值。例如,如果我們在四核系統上運行,並且 “ id ” 值爲 304%,我們將 CPU 使用率計算爲:
CPU 使用率 % = 100 – (304/4)
[root@localhost ~]# top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'|awk '{print "CPU Usage: " 100-($8/4) "%"}'
4. 結論
在本文中,我們討論了 CPU 使用率和 CPU 負載之間的區別。許多人交替使用這兩個概念,這是不正確的。之後,我們深入研究了用於檢索 CPU 利用率指標的各種方法。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/iX1dxSNPfggH1JfZThpF-w