linux分析stress模拟的性能瓶颈

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux分析stress模拟的性能瓶颈相关的知识,希望对你有一定的参考价值。

【linux】系统压力模拟工具stress 中介绍了stress的使用方法,接下来使用stress模拟一些场景并分析性能的瓶颈点

一、CPU密集型进程(使用CPU的进程)

1.1 模拟使用2个CPU

模拟使用2个CPU

[root@MH-T02 ~]# stress --cpu 2 --timeout 600
stress: info: [26766] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd

1.2 使用uptime查看cpu负载

通过uptime可以观察到,系统平均负载很高

[root@MH-T02 ~]# uptime
 13:08:21 up 28 days,  4:16,  2 users,  load average: 1.57, 0.55, 0.23

1.3 使用mpstat查看cpu使用情况

通过mpstat观察到2个CPU使用率很高,平均负载也很高,而iowait为0,说明进程是CPU密集型的

[root@MH-T02 ~]# mpstat -P ALL 5 1
Linux 3.10.0-327.el7.x86_64 (localhost21) 	2021年08月19日 	_x86_64_	(8 CPU)

19时40分42秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
19时40分47秒  all   25.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   75.00
19时40分47秒    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19时40分47秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19时40分47秒    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19时40分47秒    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19时40分47秒    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19时40分47秒    5  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时40分47秒    6  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时40分47秒    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

1.4 使用pidstat查看进程CPU使用

通过pidstat查看是哪个进程导致CPU使用率较高

[root@MH-T02 ~]# pidstat -u 5
Linux 3.10.0-327.el7.x86_64 (MH-T02) 	2021年08月19日 	_x86_64_	(4 CPU)

20时21分58秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
20时22分03秒     0       506    0.20    0.00    0.00    0.00    0.20     3  systemd-journal
20时22分03秒     0      7769    0.00    0.20    0.00    0.00    0.20     1  kworker/1:2
20时22分03秒     0     12543    0.20    0.00    0.00    0.00    0.20     3  dstat
20时22分03秒     0     23895  100.00    0.00    0.00    0.00  100.00     2  stress
20时22分03秒     0     23896  100.00    0.00    0.00    0.00  100.00     1  stress

备注:
系统中sysstat原本的版本10.1.5,需要强制更新成11+版本才有await列数据,具体升级方式

  1. wget -c http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
  2. rpm -Uvh sysstat-11.7.3-1.x86_64.rpm

通过监控信息分析可以判断很有可能是由于进程使用CPU密集导致系统平均负载变高、CPU使用率变高

二、I/O 密集型进程(等待IO的进程)

2.1 模拟IO进行压测

对IO进行压测,由于使用stress观测到的iowait指标可能为0,所以使用stress-ng

[root@MH-T02 ~]# stress-ng -i 4 --hdd 1 --timeout 600
stress-ng: info:  [28011] dispatching hogs: 1 hdd, 4 io

2.2 使用uptime查看cpu负载

通过uptime观察到,系统平均负载很高

[root@MH-T02 ~]# uptime
 19:50:55 up 28 days,  4:30,  2 users,  load average: 2.00, 1.07, 0.85

2.3 使用mpstat查看cpu使用情况

通过mpstat观察到CPU使用很低,iowait很高,一直在等待IO处理,说明此进程是IO密集型的

[root@MH-T02 ~]# mpstat -P ALL 5
Linux 3.10.0-327.el7.x86_64 (localhost21) 	2021年08月19日 	_x86_64_	(8 CPU)

19时51分22秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
19时51分27秒  all    0.03    0.00    6.39   13.05    0.00    0.00    0.00    0.00    0.00   80.54
19时51分27秒    0    0.00    0.00    0.40    0.40    0.00    0.00    0.00    0.00    0.00   99.20
19时51分27秒    1    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80
19时51分27秒    2    0.00    0.00    3.20    7.20    0.00    0.00    0.00    0.00    0.00   89.60
19时51分27秒    3    0.20    0.00   36.40   18.40    0.00    0.00    0.00    0.00    0.00   45.00
19时51分27秒    4    0.00    0.00    2.40    7.00    0.00    0.00    0.00    0.00    0.00   90.60
19时51分27秒    5    0.00    0.00    2.59    7.19    0.00    0.00    0.00    0.00    0.00   90.22
19时51分27秒    6    0.00    0.00    2.40    7.00    0.00    0.00    0.00    0.00    0.00   90.60
19时51分27秒    7    0.00    0.00    3.82   57.75    0.00    0.00    0.00    0.00    0.00   38.43

2.4 使用pidstat查看进程CPU使用

通过pidstat查看是哪个进程导致CPU使用率较高

[root@MH-T02 ~]# pidstat -u 5
Linux 3.10.0-327.el7.x86_64 (MH-T02) 	2021年08月19日 	_x86_64_	(4 CPU)

20时23分44秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
20时23分49秒     0        13    0.00    0.20    0.00    0.00    0.20     0  rcu_sched
20时23分49秒     0        14    0.00    0.20    0.00    0.00    0.20     2  rcuos/0
20时23分49秒     0      2377    0.20    0.00    0.00    0.00    0.20     3  basereport
20时23分49秒     0     12045    0.00    0.80    0.00    0.00    0.80     3  kworker/3:1H
20时23分49秒     0     13250    0.20    0.00    0.00    0.00    0.20     0  java
20时23分49秒     0     22837    0.00    2.00    0.00    0.00    2.00     2  kworker/u8:1
20时23分49秒     0     24173    0.20   43.00    0.00    0.00   43.20     1  stress-ng-hdd
20时23分49秒     0     24174    0.00    3.80    0.00    0.00    3.80     3  stress-ng-io
20时23分49秒     0     24175    0.00    0.20    0.00    0.00    0.20     2  stress-ng-io
20时23分49秒     0     24176    0.00    0.20    0.00    0.00    0.20     0  stress-ng-io
20时23分49秒     0     24178    0.00    1.40    0.00    0.00    1.40     0  stress-ng-io
20时23分49秒     0     24229    0.00    2.20    0.00    0.00    2.20     3  kworker/3:50
20时23分49秒     0     24234    0.20    0.20    0.00    0.00    0.40     3  pidstat

通过监控信息分析可以判断很有可能是由进程频繁的进行IO操作,导致系统平均负载很高而CPU使用率不高的情况

三、大量进程的场景(等待CPU的进程->进程间会争抢CPU)

3.1 模拟16个进程

模拟16个进程,本机是4核

[root@MH-T02 ~]# stress -c 16 --timeout 600
stress: info: [28486] dispatching hogs: 16 cpu, 0 io, 0 vm, 0 hdd

3.2 使用uptime查看cpu负载

通过uptime观察到系统平均负载很高

[root@MH-T02 ~]# uptime
 19:56:57 up 28 days,  4:36,  2 users,  load average: 9.38, 5.19, 2.71

3.3 使用mpstat查看cpu使用情况

通过mpstat观察到CPU使用率也很高,iowait为0,说明此进程是CPU密集型的,或者在进行CPU的争用

[root@MH-T02 ~]# mpstat -P ALL 5
Linux 3.10.0-327.el7.x86_64 (localhost21) 	2021年08月19日 	_x86_64_	(8 CPU)

19时57分20秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
19时57分25秒  all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    2  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    3  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    4  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    5  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    6  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
19时57分25秒    7  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

3.4 使用pidstat查看进程CPU使用

通过pidstat -u观察到wait指标很高,则说明进程间存在CPU争用的情况

[root@MH-T02 ~]# pidstat -u 5
Linux 3.10.0-327.el7.x86_64 (MH-T02) 	2021年08月19日 	_x86_64_	(4 CPU)

20时24分38秒   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
20时24分43秒     0     24339   24.90    0.00    0.00    0.00   24.90     1  stress
20时24分43秒     0     24340   24.90    0.00    0.00    0.00   24.90     2  stress
20时24分43秒     0     24341   24.90    0.00    0.00    0.00   24.90     1  stress
20时24分43秒     0     24342   24.90    0.00    0.00    0.00   24.90     0  stress
20时24分43秒     0     24343   24.90    0.00    0.00    0.00   24.90     1  stress
20时24分43秒     0     24344   24.90    0.00    0.00    0.00   24.90     0  stress
20时24分43秒     0     24345   24.90    0.00    0.00    0.00   24.90     3  stress
20时24分43秒     0     24346   24.90    0.00    0.00    0.00   24.90     0  stress
20时24分43秒     0     24347   24.90    0.00    0.00    0.00   24.90     3  stress
20时24分43秒     0     24348   25.10    0.00    0.00    0.00   25.10     2  stress
20时24分43秒     0     24349   24.90    0.00    0.00    0.00   24.90     3  stress
20时24分43秒     0     24350   24.70    0.00    0.00    0.00   24.70     2  stress
20时24分43秒     0     24351   24.90    0.00    0.00    0.00   24.90     1  stress
20时24分43秒     0     24352   24.90    0.00    0.00    0.00   24.90     0  stress
20时24分43秒     0     24353   24.90    0.00    0.00    0.00   24.90     3  stress
20时24分43秒     0     24354   24.90    0.00    0.00    0.00   24.90     2  stress

通过监控信息分析可以判断系统中存在大量的进程在等待使用CPU,大量的进程执行超出了CPU的计算能力的操作,导致的系统的平均负载很高

四、单进程多线程(大量线程造成上下文切换导致系统负载高)

4.1 模拟10个线程

模拟10个线程,对系统进行基准测试

[root@MH-T02 ~]# sysbench --threads=10 --time=300 threads run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 10
Initializing random number generator from current time


Initializing worker threads...

Threads started!

4.2 使用uptime查看cpu负载

[root@MH-T02 ~]# uptime
 20:30:01 up 338 days,  8:53,  4 users,  load average: 4.84, 6.56, 3.46

4.3 使用mpstat查看cpu使用情况

可以看到sys(内核态)对CPU的使用率比较高,iowait无(表示没有进程间的争用)

[root@MH-T02 ~]# mpstat -P ALL 5
Linux 3.10.0-327.el7.x86_64 (MH-T02) 	2021年08月19日 	_x86_64_	(4 CPU)

20时30分24秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
20时30分29秒  all   22.45    0.00   72.04    0.00    0.00    0.00    0.00    0.00    0.00    5.51
20时30分29秒    0   22.64    0.00   71.70    0.00    0.00    0.00    0.00    0.00    0.00    5.66
20时30分29秒    1   22.08    0.00   72.29    0.00    0.00    0.00    0.00    0.00    0.00    5.62
20时30分29秒    2   23.44    0.00   71.37    0.00    0.00    0.00    0.00    0.00    0.00    5.19
20时30分29秒    3   21.65    0.00   72.78    0.00    0.00    0.00    0.00    0.00    0.00    5.57

4.4 使用pidstat -w查看进程CPU使用

可以看到无进程间的上下文切换(默认是进程间的)

[root@MH-T02 ~]# pidstat -w  3
Linux 3.10.0-327.el7.x86_64 (MH-T02) 	2021年08月19日 	_x86_64_	(4 CPU)

20时30分48秒   UID       PID   cswch/s nvcswch/s  Command
20时30分51秒     0         1      1.00      0.00  systemd
20时30分51秒     0         3      1.33      0.00  ksoftirqd/0
20时30分51秒     0        13     13.62      0.00  rcu_sched
20时30分51秒     0        14      6.98      0.00  rcuos/0
20时30分51秒     0        15      1.99      0.00  rcuos/1
20时30分51秒     0        16      2.33      0.00  rcuos/2
20时30分51秒     0        17      1.00      0.00  rcuos/3
20时30分51秒     0        18      0.33      0.00  watchdog/0
20时30分51秒     0        19      0.33      0.00  watchdog/1
20时30分51秒     0        20      0.33      0.00  migration/1
20时30分51秒     0        21      0.66      0.00  ksoftirqd/1
20时30分51秒     0        24      0.33      0.00  watchdog/2
20时30分51秒     0        25      0.33      0.00  migration/2
20时30分51秒     0        29      0.33      0.00  watchdog/3
20时30分51秒     0        30      0.33      0.00  migration/3
20时30分51秒     0        31      0.33      0.00  ksoftirqd/3
20时30分51秒     0       435     19.93      0.00  xfsaild/dm-0
20时30分51秒     0       506      0.66      0.00  systemd-journal
20时30分51秒     0       828      0.33      0.00  irqbalance
20时30分51秒     0      1723      0.66      0.00  master
20时30分51秒     0      2974      0.33      0.00  epmd
20时30分51秒     0      9983      1.33      0.00  kworker/2:2
20时30分51秒     0     12487      1.00      0.00  sshd
20时30分51秒     0     12543      1.00      0.00  dstat
20时30分51秒     0     24229      1.00      0.00  kworker/3:50
20时30分51秒     0     24427      6.64      0.00  kworker/1:0
20时30分51秒     0     25164      1.99      0.00  kworker/0:1
20时30分51秒     0     25239      0.33      0.66  pidstat

4.5 使用pidstat查看线程CPU使用

可以看到存在大量的非自愿上下文切换(表示线程间争用引起的上下文切换,造成系统负载升高)

[root@MH-T02 ~]# pidstat -w -t 3
Linux 3.10.0-327.el7.x86_64 (MH-T02) 	2021年08月19日 	_x86_64_	(4 CPU)

20时31分28秒   UID      TGID       TID   cswch/s nvcswch/s  Command
20时31分31秒     0         1         -      0.66      0.00  systemd
20时31分31秒     0         -         1      0.66      0.00  |__systemd
20时31分31秒     0         3         -      0.66      0.00  ksoftirqd/0
20时31分31秒     0         -         3      0.66      0.00  |__ksoftirqd/0
20时31分31秒     0        13         -      8.64      0.00  rcu_sched
20时31分31秒     0         -        13      8.64      0.00  |__rcu_sched
20时31分31秒     0        14         -      3.32      0.00  rcuos/0
20时31分31秒     0         -        14      3.32      0.00  |__rcuos/0
20时31分31秒     0        15         -      1.00      0.00  rcuos/1
20时31分31秒     0         -        15      1.00      0.00  |__rcuos/1
20时31分31秒     0        16         -      1.00      0.00  rcuos/2
20时31分31秒     0         -        16      1.00      0.00  |__rcuos/2
20时31分31秒     0        17         -      1.00      0.00  rcuos/3
20时31分31秒     0         -        17      1.00      0.00  |__rcuos/3
20时31分31秒     0        18         -      0.33      0.00  watchdog/0
20时31分31秒     0         -        18      0.33      0.00  |__watchdog/0
20时31分31秒     0        19         -      0.33      0.00  watchdog/1
20时31分31秒     0         -        19      0.33      0.00  |__watchdog/1
20时31分31秒     0        21         -      0.33      0.00  ksoftirqd/1
20时31分31秒     0         -        21      0.33      0.00  |__ksoftirqd/1
20时31分31秒     0        24         -      0.33      0.00  watchdog/2
20时31分31秒     0         -        24      0.33      0.00  |__watchdog/2
20时31分31秒     0        26         -      0.33      0.00  ksoftirqd/2
20时31分31秒     0         -        26      0.33      0.00  |__ksoftirqd/2
20时31分31秒     0        29         -      0.33      0.00  watchdog/3
20时31分31秒     0         -        29      0.33      0.00  |__watchdog/3
20时31分31秒     0        31         -      0.33      0.00  ksoftirqd/3
20时31分31秒     0         -        31      0.33      0.00  |__ksoftirqd/3
20时31分31秒     0       435         -     19.93      0.00  xfsaild/dm-0
20时31分31秒     0         -       435     19.93      0.00  |__xfsaild/dm-0
20时31分31秒     0       828         -      0.33      0.00  irqbalance
20时31分31秒     0         -       828      0.33      0.00  |__irqbalance
20时31分31秒     0         -      1323      1.00      0.00  |__tuned
20时31分31秒     0         -      2298      0.33      0.00  |__agentWorker
20时31分31秒     0         -      2309      9.97      0.00  |__agentWorker
20时31分31秒     0         -      2314      9.30      0.00  |__agentWorker
20时31分31秒     0         -      2339      6.31      0.00  |__agentWorker
20时31分31秒     0         -      2379      3.99      0.00  |__basereport
20时31分31秒     0         -     24568      1.99      0.00  |__basereport
20时31分31秒     0         -     25044      1.99      0.00  |__basereport
20时31分31秒     0      2974         -      0.33      0.00  epmd
20时31分31秒     0         -      2974      0.33      0.00  |__epmd
20时31分31秒     0      9983         -      1.00      0.00  kworker/2:2
20时31分31秒     0         -      9983      1.00      0.00  |__kworker/2:2
20时31分31秒     0     12487         -      1.00      0.00  sshd
20时31分31秒     0         -     12487      1.00      0.00  |__sshd
20时31分31秒     0     12543         -      1.00      0.00  dstat
20时31分31秒     0         -     12543      1.00      0.00  |__dstat
20时31分31秒     0         -     13257      1.00      0.00  |__VM Thread
20时31分31秒     0         -     13261      0.33      0.00  |__C2 CompilerThre
20时31分31秒     0         -     13262      0.66      0.00  |__C2 CompilerThre
20时31分31秒     0         -     13263      0.33      0.00  |__C1 CompilerThre
20时31分31秒     0         -     13265     20.27      0.00  |__VM Periodic Tas
20时31分31秒     0         -     13266     99.34      0.00  |__Log4j2-TF-1-Asy
20时31分31秒     0         -     13271      0

以上是关于linux分析stress模拟的性能瓶颈的主要内容,如果未能解决你的问题,请参考以下文章

性能工具之stress工具使用教程(带源码说明)

linux系统压力模拟工具stress

linux系统压力模拟工具stress

Linux——Linux工具进阶——性能优化(待续)

微信支付异常性能测试

linux性能优化分析性能问题的一般步骤