工欲成其事,必先善其器,CentOS 7的EPEL源包含了2个压力测试工具,一个是标准的stress, 另外一个是更强大的stress-ng,可以帮助模拟产生各种cpu压力。
安装
image.png
stress
stress参数和用法都很简单:
-c,—cpu:代表进程个数(每个进程会占用一个cpu,当超出cpu个数时,进程间会互相争用cpu)
-t,—timeout:测试时长(超出这个时间后自动退出)
-i,—io:表示调用sync(),它表示通过系统调用 sync() 来模拟 I/O 的问题;
但这种方法实际上并不可靠,因为 sync() 的本意是刷新内存缓冲区的数据到磁盘中,以确保同步。
如果缓冲区内本来就没多少数据,那读写到磁盘中的数据也就不多,也就没法产生 I/O 压力。
这一点,在使用 SSD 磁盘的环境中尤为明显,很可能你的 iowait 总是 0,却单纯因为大量的系统调用,导致了系统CPU使用率 sys 升高。
这种情况,推荐使用 stress-ng 来代替 stress。
比如, 从下面可以看出经过30秒的压力后,系统负载从0.00提升至0.57。
image.png
由于stress的压力模型非常简单,所以无法模拟任何复杂的场景,举个例子,在stress压测过程中,如果用top命令去观察,会发现所有的cpu压力都在用户态,内核态没有任何压力:
image.png
stress-ng
stress-ng完全兼容stress, 并且在此基础上通过几百个参数,可以产生各种复杂的压力, 比如:
产生2个worker做圆周率算法压力:
image.png
产生2个worker从迭代使用30多种不同的压力算法,包括pi, crc16, fft等等。
image.png
产生2个worker调用socket相关函数产生压力
image.png
产生2个worker读取tsc产生压力
image.png
除了能够产生不同类型的压力,strss-ng还可以将压力指定到特定的cpu上,比如下面的命令将压力指定到cpu 0,2,3,6:
image.png
应用场景1 CPU 密集型进程(使用CPU的进程)

  1. 使用2CPU
  2. [root@nginx ~]# stress --cpu 2 --timeout 600
  3. [root@nginx ~]# uptime
  4. 10:33:44 up 28 min, 4 users, load average: 1.99, 1.39, 0.81
  5. [root@nginx ~]# mpstat -P ALL 5 1
  6. Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
  7. Average: all 50.05 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 49.87
  8. Average: 0 0.07 0.00 0.17 0.00 0.00 0.01 0.00 0.00 0.00 99.75
  9. Average: 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  10. Average: 2 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  11. Average: 3 0.08 0.00 0.15 0.01 0.00 0.01 0.00 0.00 0.00 99.76
  12. [root@nginx sysstat-12.1.5]# pidstat -u 5
  13. 1.通过uptime可以观察到,系统平均负载很高,通过mpstat观察到2CPU使用率很高,平均负载也很高,而iowait0,说明进程是CPU密集型的;
  14. 2.是由进程使用CPU密集导致系统平均负载变高、CPU使用率变高;
  15. 3.可以通过pidstat查看是哪个进程导致CPU使用率较高

应用场景2 I/O 密集型进程(等待IO的进程)

  1. IO进行压测(使用stress观测到的iowait指标可能为0,所以使用stress-ng)
  2. [root@nginx ~]# stress-ng -i 4 --hdd 1 --timeout 600
  3. [root@nginx ~]# uptime
  4. 11:11:12 up 1:05, 4 users, load average: 4.35, 4.11, 3.65
  5. [root@nginx ~]# mpstat -P ALL 5
  6. Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
  7. Average: all 0.20 0.00 13.04 38.70 0.00 1.33 0.00 0.00 0.00 46.73
  8. Average: 0 0.07 0.00 6.63 40.96 0.00 3.72 0.00 0.00 0.00 48.62
  9. Average: 1 0.19 0.00 20.14 26.77 0.00 0.04 0.00 0.00 0.00 52.85
  10. Average: 2 0.27 0.00 13.81 45.15 0.00 0.88 0.00 0.00 0.00 39.89
  11. Average: 3 0.27 0.00 11.22 42.20 0.00 0.80 0.00 0.00 0.00 45.51
  12. [root@nginx sysstat-12.1.5]# pidstat -u 5
  13. 1.可以通过uptime观察到,系统平均负载很高,通过mpstat观察到CPU使用很低,iowait很高,一直在等待IO处理,说明此进程是IO密集型的;
  14. 2.是由进程频繁的进行IO操作,导致系统平均负载很高而CPU使用率不高的情况;

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

  1. 模拟16个进程,本机是4
  2. [root@nginx ~]# stress -c 16 --timeout 600
  3. [root@nginx ~]# uptime
  4. 11:23:24 up 1:18, 4 users, load average: 15.10, 8.98, 6.04
  5. [root@nginx ~]# mpstat -P ALL 5
  6. Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
  7. Average: all 99.92 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  8. Average: 0 99.87 0.00 0.13 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  9. Average: 1 99.96 0.00 0.04 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  10. Average: 2 99.90 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  11. Average: 3 99.93 0.00 0.07 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  12. [root@nginx sysstat-12.1.5]# pidstat -u 5 1
  13. Linux 3.10.0-957.21.3.el7.x86_64 (nginx) 07/10/2019 _x86_64_ (4 CPU)
  14. 11:23:07 AM UID PID %usr %system %guest %wait %CPU CPU Command
  15. 11:23:12 AM 0 23613 25.15 0.00 0.00 75.25 25.15 1 stress
  16. 11:23:12 AM 0 23614 24.95 0.00 0.00 75.45 24.95 0 stress
  17. 11:23:12 AM 0 23615 25.15 0.00 0.00 75.25 25.15 0 stress
  18. 11:23:12 AM 0 23616 24.95 0.00 0.00 74.65 24.95 0 stress
  19. 11:23:12 AM 0 23617 25.15 0.00 0.00 74.85 25.15 1 stress
  20. 11:23:12 AM 0 23618 24.75 0.00 0.00 75.25 24.75 1 stress
  21. 11:23:12 AM 0 23619 24.75 0.00 0.00 75.85 24.75 2 stress
  22. 11:23:12 AM 0 23620 24.55 0.00 0.00 75.65 24.55 2 stress
  23. 11:23:12 AM 0 23621 25.35 0.00 0.00 74.85 25.35 3 stress
  24. 11:23:12 AM 0 23622 25.35 0.00 0.00 74.45 25.35 3 stress
  25. 11:23:12 AM 0 23623 25.15 0.00 0.00 75.65 25.15 1 stress
  26. 11:23:12 AM 0 23624 25.35 0.00 0.00 74.45 25.35 3 stress
  27. 11:23:12 AM 0 23625 24.55 0.00 0.00 75.45 24.55 2 stress
  28. 11:23:12 AM 0 23626 24.95 0.00 0.00 75.45 24.95 0 stress
  29. 11:23:12 AM 0 23627 24.75 0.00 0.00 75.65 24.75 3 stress
  30. 11:23:12 AM 0 23628 24.55 0.00 0.00 75.05 24.55 2 stress
  31. 11:23:12 AM 0 23803 0.20 0.40 0.00 0.80 0.60 2 watch
  32. 11:23:12 AM 0 24022 0.00 0.20 0.00 0.00 0.20 2 pidstat
  33. 1.通过uptime观察到系统平均负载很高,通过mpstat观察到CPU使用率也很高,iowait0,说明此进程是CPU密集型的,或者在进行CPU的争用;
  34. 2.通过pidstat -u观察到wait指标很高,则说明进程间存在CPU争用的情况,可以判断系统中存在大量的进程在等待使用CPU
  35. 3.大量的进程,超出了CPU的计算能力,导致的系统的平均负载很高;


场景四:单进程多线程(大量线程造成上下文切换,从而造成系统负载升高)

模拟10个线程,对系统进行基准测试
[root@nginx ~]# sysbench --threads=10 --time=300 threads run

可以看到平均1分钟的系统再升高
[root@nginx ~]# uptime
16:43:41 up  6:38,  4 users,  load average: 4.82, 2.10, 0.84

可以看到sys(内核态)对CPU的使用率比较高,iowait无(表示没有进程间的争用)
[root@nginx ~]# mpstat -P ALL 5
Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all   23.92    0.00   68.92    0.00    0.00    0.00    0.00    0.00    0.00    7.16
Average:       0   24.11    0.00   68.77    0.00    0.00    0.00    0.00    0.00    0.00    7.12
Average:       1   24.02    0.00   68.41    0.00    0.00    0.00    0.00    0.00    0.00    7.56
Average:       2   23.74    0.00   69.40    0.00    0.00    0.01    0.00    0.00    0.00    6.85
Average:       3   23.79    0.00   69.10    0.00    0.00    0.00    0.00    0.00    0.00    7.10

可以看到无进程间的上下文切换(默认是进程间的)
[root@nginx ~]# pidstat -w  3
04:45:46 PM   UID       PID   cswch/s nvcswch/s  Command
04:45:49 PM     0         9      2.67      0.00  rcu_sched
04:45:49 PM     0        11      0.33      0.00  watchdog/0
04:45:49 PM     0        12      0.33      0.00  watchdog/1
04:45:49 PM     0        14      0.67      0.00  ksoftirqd/1
04:45:49 PM     0        17      0.33      0.00  watchdog/2
04:45:49 PM     0        22      0.33      0.00  watchdog/3
04:45:49 PM     0       556     19.67      0.00  xfsaild/dm-0
04:45:49 PM     0     21287      0.33      0.00  sshd
04:45:49 PM     0     26834      1.00      0.00  kworker/u256:0
04:45:49 PM     0     30955      1.00      0.00  kworker/2:2
04:45:49 PM     0     31207      1.67      0.00  kworker/0:2
04:45:49 PM     0     31778      2.00      0.00  kworker/3:1
04:45:49 PM     0     32262      0.33      0.00  pidstat
04:45:49 PM     0     32263      1.00      0.00  kworker/1:1
04:45:49 PM     0     32350      0.33      0.00  kworker/3:0

可以看到存在大量的非自愿上下文切换(表示线程间争用引起的上下文切换,造成系统负载升高)
[root@nginx ~]# pidstat -w -t 3
04:48:35 PM   UID      TGID       TID   cswch/s nvcswch/s  Command
04:48:41 PM     0     32597         -      1.67      0.33  sysbench
04:48:41 PM     0         -     32597      1.67      0.33  |__sysbench
04:48:41 PM     0         -     32598   8932.67  63606.33  |__sysbench
04:48:41 PM     0         -     32599  10554.00  52275.33  |__sysbench
04:48:41 PM     0         -     32600  10941.00  49976.67  |__sysbench
04:48:41 PM     0         -     32601   9393.67  50796.33  |__sysbench
04:48:41 PM     0         -     32602  10196.67  50815.33  |__sysbench
04:48:41 PM     0         -     32603   9538.67  54755.00  |__sysbench
04:48:41 PM     0         -     32604  10112.33  50476.67  |__sysbench
04:48:41 PM     0         -     32605   9135.67  53922.00  |__sysbench
04:48:41 PM     0         -     32606  10506.33  55677.00  |__sysbench
04:48:41 PM     0         -     32607  10346.33  55691.67  |__sysbench