Linux如何檢視CPU執行狀態(詳解版)

2020-07-16 10:05:12
CPU 是影響 Linux 效能的主要因素之一,本節將介紹幾個可以用來檢視 CPU 效能的命令。

Linux CPU效能分析:vmstat命令

vmstat 命令可以顯示關於系統各種資源之間相關效能的簡要資訊,在 《Linux vmstat命令》一節中,我們已經對此命令的基本格式和用法做了詳細的介紹,因此不再贅述,這裡主要用它來看 CPU 的一個負載情況。

下面是 vmstat 命令在當前測試系統中的輸出結果:
[[email protected] ~]# vmstat 2 3
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      8 247512  39660 394168    0    0    31     8   86  269  0  1 98  1  0
0  0      8 247480  39660 394172    0    0     0     0   96  147  4  0 96  0  0
0  0      8 247484  39660 394172    0    0     0    66   95  141  2  2 96  0  0
通過分析 vmstat 命令的執行結果,可以獲得一些與當前 Linux 執行效能相關的資訊。比如說:
  • r 列表示執行和等待 CPU 時間片的進程數,如果這個值長期大於系統 CPU 的個數,就說明 CPU 不足,需要增加 CPU。
  • swpd 列表示切換到記憶體交換區的記憶體數量(以 kB 為單位)。如果 swpd 的值不為 0,或者比較大,而且 si、so 的值長期為 0,那麼這種情況下一般不用擔心,不用影響系統效能。
  • cache 列表示快取的記憶體數量,一般作為檔案系統快取,頻繁存取的檔案都會被快取。如果快取值較大,就說明快取的檔案數較多,如果此時 I/O 中 bi 比較小,就表明檔案系統效率比較好。
  • 一般情況下,si(資料由硬碟調入記憶體)、so(資料由記憶體調入硬碟) 的值都為 0,如果 si、so 的值長期不為 0,則表示系統記憶體不足,需要增加系統記憶體。
  • 如果 bi+bo 的參考值為 1000 甚至超過 1000,而且 wa 值較大,則表示系統磁碟 I/O 有問題,應該考慮提高磁碟的讀寫效能。
  • 輸出結果中,CPU 項顯示了 CPU 的使用狀態,其中當 us 列的值較高時,說明使用者進程消耗的 CPU 時間多,如果其長期大於 50%,就需要考慮優化程式或演算法;sy 列的值較高時,說明核心消耗的 CPU 資源較多。通常情況下,us+sy 的參考值為 80%,如果其值大於 80%,則表明可能存在 CPU 資源不足的情況。

總的來說,vmstat 命令的輸出結果中,我們應該重點注意 procs 項中 r 列的值,以及 CPU 項中 us 列、sy 列和 id 列的值。

Linux CPU效能分析:sar命令

除了 vmstat 命令,sar 命令也可以用來檢查 CPU 效能,它可以對系統的每個方面進行單獨的統計。

注意,雖然使用 sar 命令會增加系統開銷,不過這些開銷是可以評估的,不會對系統效能的統計結果產生很大影響。

和 vmstat 命令一樣,sar 命令的基本格式和用法已經在 《Linux sar命令》一節中做了詳細的介紹,接下來直接學習如何使用 sar 命令檢視 CPU 效能。

下面是 sar 命令對當前測試系統的 CPU 統計輸出結果:
[[email protected] ~]# sar -u 3 5
Linux 2.6.32-431.el6.x86_64 (localhost)  10/28/2019  _x86_64_ (8 CPU)

04:02:46 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:02:49 AM     all      1.69      0.00      2.03      0.00      0.00     96.27
04:02:52 AM     all      1.68      0.00      0.67      0.34      0.00     97.31
04:02:55 AM     all      2.36      0.00      1.69      0.00      0.00     95.95
04:02:58 AM     all      0.00      0.00      1.68      0.00      0.00     98.32
04:03:01 AM     all      0.33      0.00      0.67      0.00      0.00     99.00
Average:        all      1.21      0.00      1.35      0.07      0.00     97.37
此輸出結果統計的是系統中包含的 8 顆 CPU 的整體執行狀況,每項的輸出都非常直觀,其中最後一行(Average)是匯總行,是對上面統計資訊的一個平均值。

需要指出的是,sar 輸出結果中第一行包含了 sar 命令本身的統計消耗,因此 %user 列的值會偏高一點,但這並不會對統計結果產生很大影響。

另外,在一個多 CPU 的系統中,如果程式使用了單執行緒,就會出現“CPU 整體利用率不高,但系統應用響應慢”的現象,造成此現象的原因在於,單執行緒只使用一個 CPU,該 CPU 佔用率為 100%,無法處理其他請求,但除此之外的其他 CPU 卻處於閒置狀態,進而整體 CPU 使用率並不高。

針對這個問題,可以使用 sar 命令單獨檢視系統中每個 CPU 的執行狀態,例如:
[[email protected] ~]# sar -P 0 3 5
Linux 2.6.32-431.el6.x86_64 (localhost)  10/28/2019  _x86_64_ (8 CPU)

04:44:57 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:45:00 AM       0      8.93      0.00      1.37      0.00      0.00     89.69
04:45:03 AM       0      6.83      0.00      1.02      0.00      0.00     92.15
04:45:06 AM       0      0.67      0.00      0.33      0.33      0.00     98.66
04:45:09 AM       0      0.67      0.00      0.33      0.00      0.00     99.00
04:45:12 AM       0      2.38      0.00      0.34      0.00      0.00     97.28
Average:          0      3.86      0.00      0.68      0.07      0.00     95.39
注意,sar 命令對系統中 CPU 的計數是從數位 0 開始的,因此上面執行的命令表示對系統中第一顆 CPU 的執行狀態進行統計。如果想單獨統計系統中第 5 顆 CPU 的執行狀態,可以執行sar -P 4 3 5命令。

Linux CPU效能分析:iostat命令

iostat 命令主要用於統計磁碟 I/O 狀態,但也能用來檢視 CPU 的使用情況,只不過使用此命令僅能顯示系統所有 CPU 的平均狀態,無法向 sar 命令那樣做具體分析。

使用 iostat 命令檢視 CPU 執行狀態,需要使用該命令提供的 -c 選項,該選項的作用是僅顯示系統 CPU 的執行情況。例如:
[[email protected] ~]# iostat -c
Linux 2.6.32-431.el6.x86_64 (localhost)  10/28/2019  _x86_64_ (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.07    0.00    0.12    0.09    0.00   99.71
可以看到,此輸出結果中包含的項和 sar 命令的輸出項完全相同。

有關 iostat 命令的基本用法,由於不是本節重點,因為不再詳細介紹。

Linux CPU效能分析:uptime命令

uptime 命令是監控系統效能最常用的一個命令,主要用來統計系統當前的執行狀況。例如:
[[email protected] ~]# uptime
05:38:26 up  1:47,  2 users,  load average: 0.12, 0.08, 0.08
該命令的輸出結果中,各個資料所代表的含義依次是:系統當前時間、系統執行時長、當前登陸系統的使用者數量、系統分別在 1 分鐘、5 分鐘和 15 分鐘內的平均負載。

這裡需要注意的是,load average 這 3 個輸出值一般不能大於系統 CPU 的個數。例如,本測試系統有 8 個 CPU,如果 load average 中這 3 個值長期大於 8,就說明 CPU 很繁忙,負載很高,系統效能可能會受到影響;如果偶爾大於 8 則不用擔心,系統效能一般不會受到影響;如果這 3 個值小於 CPU 的個數(如本例所示),則表示 CPU 是非常空閒的。

總的來說,本節介紹了 4 個可檢視 CPU 效能的命令,但這些命令也僅能檢視 CPU 是否繁忙、負載是否過大,無法知道造成這種現象的根本原因。因此,在明確判斷出系統 CPU 出現問題之後,還要結合 top、ps 等命令,進一步檢查出是哪些進程造成的。

另外要知道的是,引發 CPU 資源緊張的原因有多個,可能是應用程式不合理造成的,也可能是硬體資源匱乏引起的。因此,要學會具體問題具體分析,或者優化應用程式,或者增加系統 CPU 資源。