Linux性能優化實戰學習筆記:第二講

1、平均負載與CPU使用率並無直接關係

一、平均負載

單位時間內,系統處於可運行狀態不可終端狀態的平均進程數也就是平均活躍進程數,它和cpu使用率並無直接關係,linux

可運行狀態:

正在使用的cpu或者正在等待cpu的進程bash

不可中斷狀態

進程是正處於內核關鍵流程中的進程,而且這些流程是不可打斷的,好比最多見的是等待硬件設備I/O響應,也就是咱們在ps命令中看到的D狀態的狀態網絡

或者中斷打斷的 ,這個時候的 進程處於不可終端狀態,若是此時的進程被打斷了 ,就容易出現磁盤數據與進程不一致的 問題工具

因此,不可中斷狀態其實是系統對進程和硬件的一種保護機制測試

二、當平均負載2時,意味着什麼呢?

既然是平均的活躍進程數,那麼最理想的,就是每一個cpu上都恰好運行着一個進程,這樣每一個cpu都獲得了充分利用,好比當平均負載2時,意味着什麼呢?ui

一、在只有2個CPU的系統上,意味着全部的CPU都恰好被徹底佔用spa

二、在4個CPU的系統上,意味着CPU有50%的空閒操作系統

三、而在只有1個CPU的系統上,則意味着有一半的進程競爭不到CPU.net

2、平均負載爲多少時合理

平均負載最理想的狀況等於CPU的個數blog

一、系統有幾個CPU?

# 關於 grep 和 wc 的用法請查詢它們的手冊或者網絡搜索

$ grep 'model name' /proc/cpuinfo | wc -l
2

平均負載高於 CPU 數量 70% 排查負載高的問題了。一旦負載太高,就可能致使進程響應變慢,進而影響服務的正常功能。

3、平均負載與 CPU 使用率

一、平均負載

一、正在使用 CPU 的進程,
二、等待 CPU
三、等待 I/O 的進程。

二、CPU使用率

是單位時間內CPU繁忙狀況的 統計,跟平均負載並不必定徹底對應

一、CPU 密集型進程,使用大量 CPU 會致使平均負載升高,此時這二者一直的
二、I/O 密集型進程,等待 I/O 也會致使平均負載升高,但 CPU 使用率不必定很高;
三、大量等待 CPU 的進程調度也會致使平均負載升高,此時的CPU 使用率也會比較高

4、實戰

一、環境與測試工具

一、操做系統

[root@luoahong ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 

二、測試工具

yum install stress-ng sysstat -y
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

三、升級sysstat版本到11.5以上

rpm -qa|grep sysstat
wget http://www.rpmfind.net/linux/mageia/distrib/cauldron/x86_64/media/core/release/sysstat-12.1.3-1.mga7.x86_64.rpm
rpm -Uvh sysstat-12.1.3-1.x86_64.rpm 
rpm -qa|grep sysstat

二、場景一:CPU 密集型進程

一、窗口1

[root@luoahong ~]# stress --cpu 1 --timeout 600
stress: info: [1307] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

二、窗口2

[root@luoahong ~]# stress --cpu 1 --timeout 600
stress: info: [1307] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

1 分鐘的平均負載會慢慢增長到 1.00
三、窗口3

#-P ALL 表示監控全部 CPU,後面數字 5 表示間隔 5 秒後輸出一組數據
[root@luoahong ~]# mpstat -P ALL 5
03:47:20 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:47:25 PM  all   25.29    0.00    0.05    0.05    0.00    0.05    0.00    0.00    0.00   74.55
03:47:25 PM    0   99.80    0.00    0.00    0.00    0.00    0.20    0.00    0.00    0.00    0.00
03:47:25 PM    1    0.00    0.00    0.20    0.20    0.00    0.00    0.00    0.00    0.00   99.59
03:47:25 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:47:25 PM    3    0.21    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.79

03:47:25 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:47:30 PM  all   24.94    0.00    0.10    0.00    0.00    0.05    0.00    0.00    0.00   74.91
03:47:30 PM    0   99.80    0.00    0.00    0.00    0.00    0.20    0.00    0.00    0.00    0.00
03:47:30 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:47:30 PM    2    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80
03:47:30 PM    3    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80

正好有一個 CPU 的使用率爲 100%,但它的只有 0。這說明,平均負載的升高正是因爲 CPU 使用率爲 100% 。

那麼,究竟是哪一個進程致使了 CPU 使用率爲 100% 呢?你可使用 pidstat 來查詢

[root@luoahong ~]# pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 02/05/2019 _x86_64_	(4 CPU)

03:51:51 PM UID PID %usr %system %guest %wait %CPU CPU Command
03:51:56 PM 0 79 0.00 0.59 0.00 0.20 0.59 2 kworker/2:2
03:51:56 PM 0 309 0.00 0.20 0.00 0.00 0.20 0 xfsaild/sda2
03:51:56 PM 0 738 0.40 0.00 0.00 0.20 0.40 1 vmtoolsd
03:51:56 PM 0 1308 99.80 0.20 0.00 0.00 100.00 3 stress
03:51:56 PM 0 1501 0.20 0.20 0.00 0.00 0.40 0 watch
03:51:56 PM 0 1752 0.00 0.40 0.00 0.00 0.40 1 pidstat

Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 79 0.00 0.59 0.00 0.20 0.59 - kworker/2:2
Average: 0 309 0.00 0.20 0.00 0.00 0.20 - xfsaild/sda2
Average: 0 738 0.40 0.00 0.00 0.20 0.40 - vmtoolsd
Average: 0 1308 99.80 0.20 0.00 0.00 100.00 - stress
Average: 0 1501 0.20 0.20 0.00 0.00 0.40 - watch
Average: 0 1752 0.00 0.40 0.00 0.00 0.40 - pidstat

從這裏能夠明顯看到,stress 進程的 CPU 使用率爲 99.80

 

三、場景二:I/O 密集型進程

一、窗口1

stress-ng -i 1 --hdd 1 --timeout 600

二、窗口2

# -d 參數表示高亮顯示變化的區域
$ watch -d uptime
...,  load average: 2.17, 0.84, 0.40

三、窗口3

[root@luoahong ~]# mpstat -P ALL 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 	02/05/2019 	_x86_64_	(2 CPU)

08:58:00 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
08:58:05 PM  all    0.32    0.00   54.64   40.51    0.00    1.79    0.00    0.00    0.00    2.74
08:58:05 PM    0    0.43    0.00   27.55   66.59    0.00    3.47    0.00    0.00    0.00    1.95
08:58:05 PM    1    0.21    0.00   80.29   15.81    0.00    0.21    0.00    0.00    0.00    3.49

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.32    0.00   54.64   40.51    0.00    1.79    0.00    0.00    0.00    2.74
Average:       0    0.43    0.00   27.55   66.59    0.00    3.47    0.00    0.00    0.00    1.95
Average:       1    0.21    0.00   80.29   15.81    0.00    0.21    0.00    0.00    0.00    3.49

1 分鐘的平均負載會慢慢增長到 1.00

其中一個 CPU 的系統 CPU 使用率升高到了 27.55,而 iowait 高達 66.59%。這說明,平均負載的升高是因爲 iowait 的升高。

那麼,究竟是哪一個進程致使了 CPU 使用率爲 100% 呢?

[root@luoahong ~]# pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 	02/05/2019 	_x86_64_	(2 CPU)

09:02:14 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
09:02:19 PM     0         3    0.00    2.17    0.00    0.79    2.17     0  ksoftirqd/0
09:02:19 PM     0         9    0.00    0.40    0.00    3.36    0.40     0  rcu_sched
09:02:19 PM     0        13    0.00    0.20    0.00    1.19    0.20     1  ksoftirqd/1
09:02:19 PM     0       291    0.00    0.20    0.00    0.99    0.20     0  xfsaild/sda2
09:02:19 PM     0       683    0.20    0.20    0.00    0.59    0.40     0  vmtoolsd
09:02:19 PM     0      3732    0.00    1.78    0.00    1.78    1.78     0  kworker/0:0
09:02:19 PM     0      4492    0.59   72.33    0.00    0.79   72.92     0  stress-ng-hdd
09:02:19 PM     0      4493    0.00    3.75    0.00    0.79    3.75     0  stress-ng-io
09:02:19 PM     0      4496    0.00    6.13    0.00    0.20    6.13     0  kworker/u256:1
09:02:19 PM     0      4589    0.00    0.40    0.00    0.40    0.40     1  kworker/1:2
09:02:19 PM     0      4621    0.00    0.40    0.00    0.00    0.40     1  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0         3    0.00    2.17    0.00    0.79    2.17     -  ksoftirqd/0
Average:        0         9    0.00    0.40    0.00    3.36    0.40     -  rcu_sched
Average:        0        13    0.00    0.20    0.00    1.19    0.20     -  ksoftirqd/1
Average:        0       291    0.00    0.20    0.00    0.99    0.20     -  xfsaild/sda2
Average:        0       683    0.20    0.20    0.00    0.59    0.40     -  vmtoolsd
Average:        0      3732    0.00    1.78    0.00    1.78    1.78     -  kworker/0:0
Average:        0      4492    0.59   72.33    0.00    0.79   72.92     -  stress-ng-hdd
Average:        0      4493    0.00    3.75    0.00    0.79    3.75     -  stress-ng-io
Average:        0      4496    0.00    6.13    0.00    0.20    6.13     -  kworker/u256:1
Average:        0      4589    0.00    0.40    0.00    0.40    0.40     -  kworker/1:2
Average:        0      4621    0.00    0.40    0.00    0.00    0.40     -  pidstat

四、場景三:大量進程的場景

當系統中運行進程超出CPU運行能力時,就會出現等待CPU的進程。

好比,咱們仍是使用stress,但此次模擬的 是8個進程:

一、窗口1

[root@luoahong ~]# stress -c 8 --timeout 600
stress: info: [5270] dispatching hogs: 8 cpu, 0 io, 0 vm, 0 hdd

二、窗口2

[root@luoahong ~]# uptime
 21:16:07 up  1:43,  3 users,  load average: 5.98, 2.14, 1.19

三、窗口3

[root@luoahong ~]# pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 	02/05/2019 	_x86_64_	(2 CPU)

09:15:30 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
09:15:35 PM     0       683    0.20    0.00    0.00    1.37    0.20     0  vmtoolsd
09:15:35 PM     0      1049    0.00    0.20    0.00    0.00    0.20     0  tuned
09:15:35 PM     0      4622    0.00    0.39    0.00    0.39    0.39     1  kworker/1:0
09:15:35 PM     0      4624    0.20    0.20    0.00    0.59    0.39     0  watch
09:15:35 PM     0      5271   24.31    0.00    0.00   74.31   24.31     1  stress
09:15:35 PM     0      5272   24.51    0.00    0.00   74.12   24.51     0  stress
09:15:35 PM     0      5273   24.31    0.00    0.00   73.92   24.31     1  stress
09:15:35 PM     0      5274   24.12    0.00    0.00   74.12   24.12     0  stress
09:15:35 PM     0      5275   24.31    0.00    0.00   74.12   24.31     1  stress
09:15:35 PM     0      5276   24.31    0.20    0.00   73.73   24.51     0  stress
09:15:35 PM     0      5277   24.31    0.20    0.00   74.31   24.51     1  stress
09:15:35 PM     0      5278   24.31    0.20    0.00   74.71   24.51     0  stress
09:15:35 PM     0      5326    0.00    0.20    0.00    0.39    0.20     0  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0       683    0.20    0.00    0.00    1.37    0.20     -  vmtoolsd
Average:        0      1049    0.00    0.20    0.00    0.00    0.20     -  tuned
Average:        0      4622    0.00    0.39    0.00    0.39    0.39     -  kworker/1:0
Average:        0      4624    0.20    0.20    0.00    0.59    0.39     -  watch
Average:        0      5271   24.31    0.00    0.00   74.31   24.31     -  stress
Average:        0      5272   24.51    0.00    0.00   74.12   24.51     -  stress
Average:        0      5273   24.31    0.00    0.00   73.92   24.31     -  stress
Average:        0      5274   24.12    0.00    0.00   74.12   24.12     -  stress
Average:        0      5275   24.31    0.00    0.00   74.12   24.31     -  stress
Average:        0      5276   24.31    0.20    0.00   73.73   24.51     -  stress
Average:        0      5277   24.31    0.20    0.00   74.31   24.51     -  stress
Average:        0      5278   24.31    0.20    0.00   74.71   24.51     -  stress
Average:        0      5326    0.00    0.20    0.00    0.39    0.20     -  pidstat

能夠看出,8 個進程在爭搶 2 個 CPU,每一個進程等待CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%這些超出 CPU 計算能力的進程,最終致使 CPU 過載。

5、小結

一、平均負載高有多是 CPU 密集型進程致使的; 二、平均負載負載高並不必定表明 CPU 使用率高,還有多是 I/O I/O 更繁忙了三、當發現負載高的時候,你可使用 mpstat、pidstat等工具,輔助分析負載的來源

相關文章
相關標籤/搜索