姬長信(Redy)

压测工具如何选择? ab、locust、Jmeter、go压测工具【单台机器100w连接压测实战】

本文介绍压测是什么,解释压测的专属名词,教大家如何计算压测指标。介绍市面上的常见压测工具(ab、locust、Jmeter、go实现的压测工具、云压测),对比这些压测工具,教大家如何选择一款适合自己的压测工具,本文还有两个压测实战项目:

目录

1、项目说明

1.1 go-stress-testing

go 实现的压测工具,每个用户用一个协程的方式模拟,最大限度的利用CPU资源

1.2 项目体验

参数说明:

-c 表示并发数

-n 每个并发执行请求的次数,总请求的次数 = 并发数 * 每个并发执行请求的次数

-u 需要压测的地址

  1. # clone 项目

  2. git clone https://github.com/link1st/go-stress-testing.git


  3. # 进入项目目录

  4. cd go-stress-testing


  5. # 运行

  6. go run main.go -c 1 -n 100 -u https://www.baidu.com/

执行以后,终端每秒钟都会输出一次结果,压测完成以后输出执行的压测结果

压测结果展示:

  1. ─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────

  2. 耗时│ 并发数 成功数│ 失败数   qps  │最长耗时 │最短耗时│平均耗时 错误码

  3. ─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────

  4.   1s      1      8      0    8.09  133.16  110.98  123.56200:8

  5.   2s      1     15      0    8.02  138.74  110.98  124.61200:15

  6.   3s      1     23      0    7.80  220.43  110.98  128.18200:23

  7.   4s      1     31      0    7.83  220.43  110.23  127.67200:31

  8.   5s      1     39      0    7.81  220.43  110.23  128.03200:39

  9.   6s      1     46      0    7.72  220.43  110.23  129.59200:46

  10.   7s      1     54      0    7.79  220.43  110.23  128.42200:54

  11.   8s      1     62      0    7.81  220.43  110.23  128.09200:62

  12.   9s      1     70      0    7.79  220.43  110.23  128.33200:70

  13.  10s      1     78      0    7.82  220.43  106.47  127.85200:78

  14.  11s      1     84      0    7.64  371.02  106.47  130.96200:84

  15.  12s      1     91      0    7.63  371.02  106.47  131.02200:91

  16.  13s      1     99      0    7.66  371.02  106.47  130.54200:99

  17.  13s      1    100      0    7.66  371.02  106.47  130.52200:100



  18. *************************  结果 stat  ****************************

  19. 处理协程数量: 1

  20. 请求总数: 100 总请求时间: 13.055 successNum: 100 failureNum: 0

  21. *************************  结果 end   ****************************

参数解释:

耗时: 程序运行耗时。程序每秒钟输出一次压测结果

并发数: 并发数,启动的协程数

成功数: 压测中,请求成功的数量

失败数: 压测中,请求失败的数量

qps: 当前压测的QPS(每秒钟处理请求数量)

最长耗时: 压测中,单个请求最长的响应时长

最短耗时: 压测中,单个请求最短的响应时长

平均耗时: 压测中,单个请求平均的响应时长

错误码: 压测中,接口返回的 code码:返回次数的集合

2、压测

2.1 压测是什么

压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。

主要检测服务器的承受能力,包括用户承受能力(多少用户同时玩基本不影响质量)、流量承受等。

2.2 为什么要压测

2.3 压测名词解释

2.3.1 压测类型解释

压测类型 解释
压力测试(Stress Testing) 也称之为强度测试,测试一个系统的最大抗压能力,在强负载(大数据、高并发)的情况下,测试系统所能承受的最大压力,预估系统的瓶颈
并发测试(Concurrency Testing) 通过模拟很多用户同一时刻访问系统或对系统某一个功能进行操作,来测试系统的性能,从中发现问题(并发读写、线程控制、资源争抢)
耐久性测试(Configuration Testing) 通过对系统在大负荷的条件下长时间运行,测试系统、机器的长时间运行下的状况,从中发现问题(内存泄漏、数据库连接池不释放、资源不回收)

2.3.2 压测名词解释

压测名词 解释
并发(Concurrency) 指一个处理器同时处理多个任务的能力(逻辑上处理的能力)
并行(Parallel) 多个处理器或者是多核的处理器同时处理多个不同的任务(物理上同时执行)
QPS(每秒钟查询数量 Query Per Second) 服务器每秒钟处理请求数量 (req/sec 请求数/秒 一段时间内总请求数/请求时间)
事务(Transactions) 是用户一次或者是几次请求的集合
TPS(每秒钟处理事务数量 Transaction Per Second) 服务器每秒钟处理事务数量(一个事务可能包括多个请求)
请求成功数(Request Success Number) 在一次压测中,请求成功的数量
请求失败数(Request Failures Number) 在一次压测中,请求失败的数量
错误率(Error Rate) 在压测中,请求成功的数量与请求失败数量的比率
最大响应时间(Max Response Time) 在一次事务中,从发出请求或指令系统做出的反映(响应)的最大时间
最少响应时间(Mininum Response Time) 在一次事务中,从发出请求或指令系统做出的反映(响应)的最少时间
平均响应时间(Average Response Time) 在一次事务中,从发出请求或指令系统做出的反映(响应)的平均时间

2.3.3 机器性能指标解释

机器性能 解释
CUP利用率(CPU Usage) CUP 利用率分用户态、系统态和空闲态,CPU利用率是指:CPU执行非系统空闲进程的时间与CPU总执行时间的比率
内存使用率(Memory usage) 内存使用率指的是此进程所开销的内存。
IO(Disk input/ output) 磁盘的读写包速率
网卡负载(Network Load) 网卡的进出带宽,包量

2.3.4 访问指标解释

访问 解释
PV(页面浏览量 Page View) 用户每打开1个网站页面,记录1个PV。用户多次打开同一页面,PV值累计多次
UV(网站独立访客 Unique Visitor) 通过互联网访问、流量网站的自然人。1天内相同访客多次访问网站,只计算为1个独立访客

2.4 如何计算压测指标

(30000000*0.8)/(86400*0.2)1389(QPS)

1389/6920

3、常见的压测工具

3.1 ab

ApacheBench 是 Apache服务器自带的一个web压力测试工具,简称ab。ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。

ab属于一个轻量级的压测工具,结果不会特别准确,可以用作参考。

# 在linux环境安装sudo yum -y install httpd
  1. Usage: ab [options] [http[s]://]hostname[:port]/path

  2. 用法:ab [选项] 地址


  3. 选项:

  4. Options are:

  5.    -n requests      #执行的请求数,即一共发起多少请求。

  6.    -c concurrency   #请求并发数。

  7.    -s timeout       #指定每个请求的超时时间,默认是30秒。

  8.    -k               #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。

# 使用ab压测工具,对百度的链接 请求100次,并发数1ab -n 100 -c 1 https://www.baidu.com/

压测结果

  1. ~ >ab -n 100 -c 1 https://www.baidu.com/

  2. This is ApacheBench, Version 2.3 $Revision: 1430300 $>

  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

  4. Licensed to The Apache Software Foundation, http://www.apache.org/


  5. Benchmarking www.baidu.com (be patient).....done



  6. Server Software:        BWS/1.1

  7. Server Hostname:        www.baidu.com

  8. Server Port:            443

  9. SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128


  10. Document Path:          /

  11. Document Length:        227 bytes


  12. Concurrency Level:      1

  13. Time taken for tests:   9.430 seconds

  14. Complete requests:      100

  15. Failed requests:        0

  16. Write errors:           0

  17. Total transferred:      89300 bytes

  18. HTML transferred:       22700 bytes

  19. Requests per second:    10.60 [#/sec] (mean)

  20. Time per request:       94.301 [ms] (mean)

  21. Time per request:       94.301 [ms] (mean, across all concurrent requests)

  22. Transfer rate:          9.25 [Kbytes/sec] received


  23. Connection Times (ms)

  24.              min  mean[+/-sd] median   max

  25. Connect:       54   70  16.5     69     180

  26. Processing:    18   24  12.0     23     140

  27. Waiting:       18   24  12.0     23     139

  28. Total:         72   94  20.5     93     203


  29. Percentage of the requests served within a certain time (ms)

  30.  50%     93

  31.  66%     99

  32.  75%    101

  33.  80%    102

  34.  90%    108

  35.  95%    122

  36.  98%    196

  37.  99%    203

  38. 100%    203 (longest request)

3.2 Locust

是非常简单易用、分布式、python开发的压力测试工具。有图形化界面,支持将压测数据导出。

# pip3 安装locustpip3  install locust# 查看是否安装成功locust -h# 运行 Locust 分布在多个进程/机器库pip3 install pyzmq# webSocket 压测库pip3 install websocket-client

编写压测脚本 test.py

  1. from locust import HttpLocust, TaskSet, task


  2. # 定义用户行为

  3. class UserBehavior(TaskSet):


  4.    @task

  5.    def baidu_index(self):

  6.        self.client.get("/")



  7. class WebsiteUser(HttpLocust):

  8.    task_set = UserBehavior # 指向一个定义的用户行为类

  9.    min_wait = 3000 # 执行事务之间用户等待时间的下界(单位:毫秒)

  10.    max_wait = 6000 # 执行事务之间用户等待时间的上界(单位:毫秒)

locust -f  test.py --host=https://www.baidu.com

访问 http://localhost:8089 进入压测首页

Number of users to simulate 模拟用户数

Hatch rate (users spawned/second) 每秒钟增加用户数

点击 "Start swarming" 进入压测页面

压测界面右上角有:被压测的地址、当前状态、RPS、失败率、开始或重启按钮

性能测试参数

3.3 Jmeter

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。

访问 https://jmeter-plugins.org/install/Install/ 下载解压以后即可使用

JMeter的功能过于强大,这里暂时不介绍用法,可以查询相关文档使用(参考文献中有推荐的教程文档)

3.4 云压测

3.4.1 云压测介绍

顾名思义就是将压测脚本部署在云端,通过云端对对我们的应用进行全方位压测,只需要配置压测的参数,无需准备实体机,云端自动给我们分配需要压测的云主机,对被压测目标进行压测。

云压测的优势:

  1. 轻易的实现分布式部署

  2. 能够模拟海量用户的访问

  3. 流量可以从全国各地发起,更加真实的反映用户的体验

  4. 全方位的监控压测指标

  5. 文档比较完善

当然了云压测是一款商业产品,在使用的时候自然还是需要收费的,而且价格还是比较昂贵的~

3.4.2 阿里云 性能测试 PTS

PTS(Performance Testing Service)是面向所有技术背景人员的云化测试工具。有别于传统工具的繁复,PTS以互联网化的交互,提供性能测试、API调试和监测等多种能力。自研和适配开源的功能都可以轻松模拟任意体量的用户访问业务的场景,任务随时发起,免去繁琐的搭建和维护成本。更是紧密结合监控、流控等兄弟产品提供一站式高可用能力,高效检验和管理业务性能。

阿里云同样还是支持渗透测试,通过模拟黑客对业务系统进行全面深入的安全测试。

3.4.3 腾讯云 压测大师 LM

通过创建虚拟机器人模拟多用户的并发场景,提供一整套完整的服务器压测解决方案

4、go-stress-testing go语言实现的压测工具

4.1 介绍

go-stress-testing 是go语言实现的简单压测工具,源码开源、支持二次开发,可以压测http、webSocket请求,使用协程模拟单个用户,可以更高效的利用CPU资源。

4.2 用法

Usage of ./go_stress_testing_mac:  -c uint        并发数 (default 1)  -d string        调试模式 (default "false")  -n uint        请求总数 (default 1)  -p string        curl文件路径  -u string        请求地址  -v string        验证方法 http 支持:statusCode、json webSocket支持:json (default "statusCode")
  1. ─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────

  2. 耗时│ 并发数 成功数│ 失败数   qps  │最长耗时 │最短耗时│平均耗时 错误码

  3. ─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────

  4.   1s      1      8      0    8.09  133.16  110.98  123.56200:8

  5.   2s      1     15      0    8.02  138.74  110.98  124.61200:15

  6.   3s      1     23      0    7.80  220.43  110.98  128.18200:23

  7.   4s      1     31      0    7.83  220.43  110.23  127.67200:31

  8.   5s      1     39      0    7.81  220.43  110.23  128.03200:39

  9.   6s      1     46      0    7.72  220.43  110.23  129.59200:46

  10.   7s      1     54      0    7.79  220.43  110.23  128.42200:54

  11.   8s      1     62      0    7.81  220.43  110.23  128.09200:62

  12.   9s      1     70      0    7.79  220.43  110.23  128.33200:70

  13.  10s      1     78      0    7.82  220.43  106.47  127.85200:78

  14.  11s      1     84      0    7.64  371.02  106.47  130.96200:84

  15.  12s      1     91      0    7.63  371.02  106.47  131.02200:91

  16.  13s      1     99      0    7.66  371.02  106.47  130.54200:99

  17.  13s      1    100      0    7.66  371.02  106.47  130.52200:100



  18. *************************  结果 stat  ****************************

  19. 处理协程数量: 1

  20. 请求总数: 100 总请求时间: 13.055 successNum: 100 failureNum: 0

  21. *************************  结果 end   ****************************

0

curl是Linux在命令行下的工作的文件传输工具,是一款很强大的http命令行工具。

使用curl文件可以压测使用非GET的请求,支持设置http请求的 method、cookies、header、body等参数

chrome 浏览器生成 curl文件,打开开发者模式(快捷键F12),如图所示,生成 curl 在终端执行命令

生成内容粘贴到项目目录下的curl/baidu.curl.txt文件中,执行下面命令就可以从curl.txt文件中读取需要压测的内容进行压测了

  1. ─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────

  2. 耗时│ 并发数 成功数│ 失败数   qps  │最长耗时 │最短耗时│平均耗时 错误码

  3. ─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────

  4.   1s      1      8      0    8.09  133.16  110.98  123.56200:8

  5.   2s      1     15      0    8.02  138.74  110.98  124.61200:15

  6.   3s      1     23      0    7.80  220.43  110.98  128.18200:23

  7.   4s      1     31      0    7.83  220.43  110.23  127.67200:31

  8.   5s      1     39      0    7.81  220.43  110.23  128.03200:39

  9.   6s      1     46      0    7.72  220.43  110.23  129.59200:46

  10.   7s      1     54      0    7.79  220.43  110.23  128.42200:54

  11.   8s      1     62      0    7.81  220.43  110.23  128.09200:62

  12.   9s      1     70      0    7.79  220.43  110.23  128.33200:70

  13.  10s      1     78      0    7.82  220.43  106.47  127.85200:78

  14.  11s      1     84      0    7.64  371.02  106.47  130.96200:84

  15.  12s      1     91      0    7.63  371.02  106.47  131.02200:91

  16.  13s      1     99      0    7.66  371.02  106.47  130.54200:99

  17.  13s      1    100      0    7.66  371.02  106.47  130.52200:100



  18. *************************  结果 stat  ****************************

  19. 处理协程数量: 1

  20. 请求总数: 100 总请求时间: 13.055 successNum: 100 failureNum: 0

  21. *************************  结果 end   ****************************

1

4.3 实现

  1. ─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────

  2. 耗时│ 并发数 成功数│ 失败数   qps  │最长耗时 │最短耗时│平均耗时 错误码

  3. ─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────

  4.   1s      1      8      0    8.09  133.16  110.98  123.56200:8

  5.   2s      1     15      0    8.02  138.74  110.98  124.61200:15

  6.   3s      1     23      0    7.80  220.43  110.98  128.18200:23

  7.   4s      1     31      0    7.83  220.43  110.23  127.67200:31

  8.   5s      1     39      0    7.81  220.43  110.23  128.03200:39

  9.   6s      1     46      0    7.72  220.43  110.23  129.59200:46

  10.   7s      1     54      0    7.79  220.43  110.23  128.42200:54

  11.   8s      1     62      0    7.81  220.43  110.23  128.09200:62

  12.   9s      1     70      0    7.79  220.43  110.23  128.33200:70

  13.  10s      1     78      0    7.82  220.43  106.47  127.85200:78

  14.  11s      1     84      0    7.64  371.02  106.47  130.96200:84

  15.  12s      1     91      0    7.63  371.02  106.47  131.02200:91

  16.  13s      1     99      0    7.66  371.02  106.47  130.54200:99

  17.  13s      1    100      0    7.66  371.02  106.47  130.52200:100



  18. *************************  结果 stat  ****************************

  19. 处理协程数量: 1

  20. 请求总数: 100 总请求时间: 13.055 successNum: 100 failureNum: 0

  21. *************************  结果 end   ****************************

2

4.4 go-stress-testing 对 Golang web 压测

这里使用go-stress-testing对go server进行压测(部署在同一台机器上),并统计压测结果

CPU: 4核 (Intel Xeon(Cascade Lake) Platinum 8269 2.5 GHz/3.2 GHz)

内存: 16G 硬盘: 20G SSD 系统: CentOS 7.6

go version: go1.12.9 linux/amd64

  1. ─────┬───────┬───────┬───────┬────────┬────────┬────────┬────────┬────────

  2. 耗时│ 并发数 成功数│ 失败数   qps  │最长耗时 │最短耗时│平均耗时 错误码

  3. ─────┼───────┼───────┼───────┼────────┼────────┼────────┼────────┼────────

  4.   1s      1      8      0    8.09  133.16  110.98  123.56200:8

  5.   2s      1     15      0    8.02  138.74  110.98  124.61200:15

  6.   3s      1     23      0    7.80  220.43  110.98  128.18200:23

  7.   4s      1     31      0    7.83  220.43  110.23  127.67200:31

  8.   5s      1     39      0    7.81  220.43  110.23  128.03200:39

  9.   6s      1     46      0    7.72  220.43  110.23  129.59200:46

  10.   7s      1     54      0    7.79  220.43  110.23  128.42200:54

  11.   8s      1     62      0    7.81