天天看點

Linux性能調優 | 01 平均負載的了解和分析

01 uptime指令

通常我們發現系統變慢時,我們都會執行top或者uptime指令,來檢視目前系統的負載情況,比如像下面,我執行了uptime,系統傳回的了結果。

[root@lincoding ~]# uptime
 08:31:49 up 27 min,  1 user,  load average: 0.07, 0.04, 0.00
           

前幾列的資訊,相信大家都很熟悉,它們分别是目前時間、系統運作時間和正在登陸的使用者個數,最後一個就是系統平均負載的情況。

08:31:49                        // 目前時間
up 27 min                       // 系統運作時間
1 user                          // 正在登入使用者數
load average: 0.07, 0.04, 0.00  // 平均負載的情況
           

Load Average的三個數字,依次則是過去1分鐘、5分鐘、15分鐘的平均負載。可以通過觀察這三個數字的大小,可以簡單判斷系統的負載是下降的趨勢還是上升的趨勢。

  • 如果

    load average: 1.00, 5.00, 10.00

    三個數字依次增大,則說明在過去的 1 分鐘系統的負載比過去 15 分鐘系統的負載小,表明系統的負載是下降的趨勢。
  • load average: 10.00, 5.00, 1.00

    三個數字依次降低,則說明在過去的 1 分鐘系統的負載比過去 15 分鐘系統的負載大,表明系統的負載是上升的趨勢。
  • load average: 0.07, 0.04, 0.0

    三個數字基本相同,或者相差不大, 表明系統的負載是平穩的。

是以分析系統的負載情況,必須要看三個不同時間間隔的平均值。

02 平均負載概念

平均負載很多人容易了解成機關時間内的 CPU 使用率,這是不正确的。平均負載确實與 CPU 使用率有關系,但不是直接的關系。

簡單來說,平均負載是指機關時間内,系統處于可運作狀态和不可中斷狀态的平均程序數,也就是平均活躍程序數,它和 CPU 使用率并沒有直接關系。

  • 可運作狀态,是指正在使用 CPU 或者正在等待 CPU 的程序,也就是在 ps 指令看到的 R 狀态的程序。
  • 不可中斷狀态,是指正處于核心關鍵流程中的程序,并且這些流程是不可以打斷的,比如最常見的等待硬體裝置的 I/O 響應,也就是在 ps 指令看到的 D 狀态的程序。

是以,平均負載其實就是平均活躍程序數,可以更直覺的了解成機關時間内的活躍程序數。

既然平均的是活躍程序數,那麼最理想的,就是每個CPU上剛好運作着一個程序,這樣每個CPU就得到了充分利用。

比如當平均負載為2時,意味着:

  • 在隻有 2 個 CPU 的系統上,意味着所有的 CPU 都剛好被完全占用。
  • 在4個CPU的系統上,意味着 CPU 有 50% 的空閑。
  • 在隻有 1 個 CPU 的系統中,則意味着有一半的程序競争不到 CPU。

03 平均負載為多少時合理

在評判你目前的系統平均負載是否合理的時,首先你要知道系統有幾個 CPU,可以通過 lscpu 指令或者從檔案 /proc/cpuinfo 中讀取

# lscpu 指令檢視 CPU 個數
[root@lincoding ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4 # 這裡數字表示 CPU 個數        
....

# 從檔案 /proc/cpuinfo 中檢視 CPU 個數
[root@lincoding ~]# grep 'model name' /proc/cpuinfo | wc -l
4
           

有了 CPU 個數,我們就可以判斷出,當平均負載比 CPU 個數還大的時候,系統已經出現了過載。

這裡我再舉個例子,假設我們在一個單 CPU 系統上看到平均負載為 1.73,0.60,7.98

  • 在過去 1 分鐘内,系統有 73% 的超載
  • 在過 15 分鐘内,有 698%的超載,從整體趨勢來看,系統的負載在降低。

平均負載高于 CPU 數量 70% 的時候,就應該分析排查負載高的問題了。一旦負載過高,就可能導緻程序響應變慢,進而影響服務的正常功能。

04 平均負載與 CPU 使用率

我們經常容易把平均負載和 CPU 使用率混淆,是以在這裡,我也做一個區分。

再次說明下,平均負載是指機關時間内,處于可運作狀态和不可中斷狀态的程序數。是以,它不僅包括了正在使用 CPU 的程序,還包括等待 CPU 和等待 I/O 的程序。

而 CPU 使用率,是機關時間内 CPU 繁忙情況的統計,跟平均負載并不一定完全對應。比如:

  • CPU 密集型程序,使用大量 CPU 會導緻平均負載升高,此時這兩者是一緻的;
  • I/O 密集型程序,等待 I/O 也會導緻平均負載升高,但 CPU 使用率不一定很高;
  • 大量等待 CPU 的程序排程也會導緻平均負載升高,此時的 CPU 使用率也會比較高。

05 平均負載升高分析指令

我們現在很清楚的知道導緻平均負載高的情況,不隻是看 CPU 的使用率,也要觀察系統 I/O 等待時間高不高。

當發現平均負載升高時,可以使用

mpstat

指令檢視 CPU 的性能。

# -P ALL 表示監控所有CPU,後面數字1表示間隔1秒後輸出一組資料
$ mpstat -P ALL 1
Linux 2.6.32-431.el6.x86_64 (lzc) 	11/05/2019 	_x86_64_	(2 CPU)

07:51:45 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
07:51:50 PM  all   42.90    0.00   49.39    0.41    0.00    4.56    0.00    0.00    2.74
07:51:50 PM    0   44.38    0.00   48.67    0.41    0.00    2.86    0.00    0.00    3.68
07:51:50 PM    1   41.57    0.00   49.80    0.40    0.00    6.43    0.00    0.00    1.81
           

從上面發現

  • CPU 的使用者層(%usr)使用率高達45%左右;
  • CPU 的系統層(%sys)使用率高達50%左右;
  • CPU 的 I/0 - 等待(%iowait)占用率為0.41%;
  • CPU 的空閑率(%idle)隻有2~3%。

可以推斷出是由于 CPU 使用率導緻平均負載升高的情況。

假設隻有 CPU 的I/0 等待(%iowait)占用率高,CPU 使用者層和系統層使用率很輕松,那麼導緻平均負載升高的原因就是 iowait 的升高。

# 間隔1秒後輸出一組資料,-u表示CPU名額
$ pidstat -u 1
08:07:55 PM       PID    %usr %system  %guest    %CPU   CPU  Command
08:07:56 PM         4    0.00    1.00    0.00    1.00     0  ksoftirqd/0
08:07:56 PM         9    0.00    1.00    0.00    1.00     1  ksoftirqd/1
08:07:56 PM        11    0.00   16.00    0.00   16.00     0  events/0
08:07:56 PM        12    0.00   20.00    0.00   20.00     1  events/1
08:07:56 PM       616    7.00    6.00    0.00   13.00     1  pppoe
08:07:56 PM      2745    6.00    6.00    0.00   12.00     1  pppoe
           

06 小結

  • 平均負載高有可能是 CPU 密集型程序導緻的;
  • 平均負載高并不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
  • 當發現負載高的時候,你可以使用

    mpstat

    pidstat

    等工具,輔助分析負載的來源。

繼續閱讀