1. 程式人生 > >Linux性能優化實戰:負載均衡與CPU使用率(01)

Linux性能優化實戰:負載均衡與CPU使用率(01)

場景 .com ash stat 性能優化 etc pan com mps

一、CPU使用率並沒有直接關系

1、平均負載

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

可運行狀態:

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

不可中斷狀態

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

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

所以,不可中斷狀態實際上是系統對進程和硬件的一種保護機制

2、當平均負載2時,意味著什麽呢?

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

1、在只有2個CPU的系統上,意味著所有的CPU都剛好被完全占用

2、在4個CPU的系統上,意味著CPU有50%的空閑

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

二、平均負載為多少時合理

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

1、系統有幾個CPU?

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

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

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

三、平均負載與 CPU 使用率

1、平均負載

1、正在使用 CPU 的進程,
2、等待 CPU
3、等待 I/O 的進程。

2、CPU使用率

是單位時間內CPU繁忙情況的 統計,跟平均負載並不一定完全對應

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

四、實戰

1、環境與測試工具

1、操作系統

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

2、測試工具

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

3、升級sysstat版本到11.5以上

rpm -qa|grep sysstat
rz -y
rpm -Uvh sysstat-12.1.2-1.x86_64.rpm 
rpm -qa|grep sysstat

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

1、窗口1

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

2、窗口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、窗口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

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

1、窗口1

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

2、窗口2

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

3、窗口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

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

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

比如,我們還是使用stress,但這次模擬的 是8個進程:

1、窗口1

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

2、窗口2

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

3、窗口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 過載。

五、小結

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

Linux性能優化實戰:負載均衡與CPU使用率(01)