1、cpu平均負載和cpu使用率 排查cpu使用高問題

1. CPU

  1. cpu平均負載
    uptime 或 top 查看 cpu 平均負載(平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,,它和 CPU 使用率並沒有直接關係)
$ uptime
02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88
當前時間     運行時間        正在登錄用戶數           1min   5min  15min
  1. 查看邏輯CPU個數 (當平均負載高於 CPU 數量 70% 的時候)
grep 'model name' /proc/cpuinfo | wc -l  邏輯CPU個數
  • 平均負載其實就是平均活躍進程數,那麼最理想的,就是每個 CPU 上都剛好運行着一個進程,有了 CPU 個數,我們就可以判斷出,當平均負載比 CPU 個數還大的時候,系統已經出現了過載。
    如果 1 分鐘、5 分鐘、15 分鐘的三個值基本相同,或者相差不大,那就說明系統負載很平穩。
    但如果 1 分鐘的值遠小於 15 分鐘的值,就說明系統最近 1 分鐘的負載在減少,而過去 15 分鐘內卻有很大的負載。
  • 反過來,如果 1 分鐘的值遠大於 15 分鐘的值,就說明最近 1 分鐘的負載在增加,這種增加有可能只是臨時性的,也有可能還會持續增加下去,所以就需要持續觀察。一旦 1 分鐘的平均負載接近或超過了 CPU 的個數,就意味着系統正在發生過載的問題,這時就得分析調查是哪裏導致的問題,並要想辦法優化了
  • 假設我們在一個單 CPU 系統上看到平均負載爲 1.73,0.60,7.98,那麼說明在過去 1 分鐘內,系統有 73% 的超載,而在 15 分鐘內,有 698% 的超載,從整體趨勢來看,系統的負載在降低。

2. CPU 使用率

平均負載是指單位時間內,處於可運行狀態和不可中斷狀態的進程數。所以,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程。
而 CPU 使用率,是單位時間內 CPU 繁忙情況的統計,跟平均負載並不一定完全對應。比如:
CPU 密集型進程,使用大量 CPU 會導致平均負載升高,此時這兩者是一致的;
I/O 密集型進程,等待 I/O 也會導致平均負載升高,但 CPU 使用率不一定很高;
大量等待 CPU 的進程調度也會導致平均負載升高,此時的 CPU 使用率也會比較高。

3. 測試:

  1. 安裝stress(Linux系統壓力測試工具)和sysstat(Linux性能工具)(Centos7系統)
    安裝stress(Linux系統壓力測試工具)和sysstat(Linux性能工具)
    yum install stress 一直找不到鏡像處理方式 所以用了rpm方式安裝
    用rpm方式安裝,先從下面的地址下載rpm包
    http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm
    然後 rpm -Uvh stress-1.0.2-1.el7.rf.x86_64.rpm 安裝
    sysstat使用yum安裝 yum install sysstat
  • 查看平均負載變化率 watch -d uptime
$ watch -d uptime
...,  load average: 1.06, 0.58, 0.37
  • 查看cpu使用率 mpstat -P ALL 5
顯示所有CPU的指標,並在間隔5秒輸出一組數據
$ mpstat -P ALL 5 20
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:41:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:41:33     all    0.21    0.00   12.07   32.67    0.00    0.21    0.00    0.00    0.00   54.84
13:41:33       0    0.43    0.00   23.87   67.53    0.00    0.43    0.00    0.00    0.00    7.74
13:41:33       1    0.00    0.00    0.81    0.20    0.00    0.00    0.00    0.00    0.00   98.99
  • 查看哪個進程佔用cpu高 pidstat -u 5 1
# 間隔5秒後輸出一組數據,-u表示CPU指標   pidstat輸出中沒有%wait的問題,
是因爲CentOS默認的sysstat稍微有點老,源碼或者RPM升級到11.5.5版本以後就可以看到了
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:42:08      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
13:42:13        0       104    0.00    3.39    0.00    0.00    3.39     1  kworker/1:1H
13:42:13        0       109    0.00    0.40    0.00    0.00    0.40     0  kworker/0:1H
13:42:13        0      2997    2.00   35.53    0.00    3.99   37.52     1  stress
13:42:13        0      3057    0.00    0.40    0.00    0.00    0.40     0  pidstat
  • 平均負載高有可能是 CPU 密集型進程導致的;
    平均負載高並不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
    當發現負載高的時候,你可以使用 mpstat、pidstat 等工具,輔助分析負載的來源。

4. 總結

一、什麼是平均負載
正確定義:單位時間內,系統中處於可運行狀態和不可中斷狀態的平均進程數。
錯誤定義:單位時間內的cpu使用率。
可運行狀態的進程:正在使用cpu或者正在等待cpu的進程,即ps aux命令下STAT處於R狀態的進程
不可中斷狀態的進程:處於內核態關鍵流程中的進程,且不可被打斷,如等待硬件設備IO響應,ps命令D狀態的進程
理想狀態:每個cpu上都有一個活躍進程,即平均負載數等於cpu數
過載經驗值:平均負載高於cpu數量70%的時候

二、相關命令
cpu核數: lscpu、 grep ‘model name’ /proc/cpuinfo | wc -l
顯示平均負載:uptime、top,顯示的順序是最近1分鐘、5分鐘、15分鐘,從此可以看出平均負載的趨勢
watch -d uptime: -d會高亮顯示變化的區域
strees: 壓測命令,–cpu cpu壓測選項,-i io壓測選項,-c 進程數壓測選項,–timeout 執行時間
mpstat: 多核cpu性能分析工具,-P ALL監視所有cpu
pidstat: 進程性能分析工具,-u 顯示cpu利用率

三、平均負載與cpu使用率的區別
CPU使用率:單位時間內cpu繁忙情況的統計
情況1:CPU密集型進程,CPU使用率和平均負載基本一致
情況2:IO密集型進程,平均負載升高,CPU使用率不一定升高
情況3:大量等待CPU的進程調度,平均負載升高,CPU使用率也升高

四、平均負載過高時,如何調優
工具:stress、sysstat,yum即可安裝

  1. CPU密集型進程case:
    mpstat -P ALL 5: -P ALL表示監控所有CPU,5表示每5秒刷新一次數據,觀察是否有某個cpu的%usr會很高,但iowait應很低
    pidstat -u 5 1:每5秒輸出一組數據,觀察哪個進程%cpu很高,但是%wait很低,極有可能就是這個進程導致cpu飈高
  2. IO密集型進程case:
    mpstat -P ALL 5: 觀察是否有某個cpu的%iowait很高,同時%usr也較高
    pidstat -u 5 1:觀察哪個進程%wait較高,同時%CPU也較高
  3. 大量進程case:
    pidstat -u 5 1:觀察那些%wait較高的進程是否有很多
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章