一、压测介绍
1.1 压测是什么
压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。
主要检测服务器的承受能力,包括用户承受能力(多少用户同时玩基本不影响质量)、流量承受等。
1.2 压测的意义
- 压测的目的就是通过压测(模拟真实用户的行为),测算出机器的性能(单台机器的QPS),从而推算出系统在承受指定用户数(100W)时,需要多少机器能支撑得住。
- 压测是在上线前为了应对未来可能达到的用户数量的一次预估(提前演练),压测以后通过优化程序的性能或准备充足的机器,来保证用户的体验。
1.3 压测术语
1.3.1 压测类型解释
压测类型 | 解释 |
---|---|
压力测试(Stress Testing) | 也称之为强度测试,测试一个系统的最大抗压能力,在强负载(大数据、高并发)的情况下,测试系统所能承受的最大压力,预估系统的瓶颈 |
并发测试(Concurrency Testing) | 通过模拟很多用户同一时刻访问系统或对系统某一个功能进行操作,来测试系统的性能,从中发现问题(并发读写、线程控制、资源争抢) |
耐久性测试(Configuration Testing) | 通过对系统在大负荷的条件下长时间运行,测试系统、机器的长时间运行下的状况,从中发现问题(内存泄漏、数据库连接池不释放、资源不回收) |
1.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) | 在一次压测中,从发出请求或指令系统做出的反映(响应)的平均时间 |
吞吐量(Throughput) | 指系统在单位时间内处理请求的数量 |
QPS vs TPS:
QPS基本类似于TPS,但是不同的是:
对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求。服务器对这些请求,就可计入 QPS 之中。如,访问一个页面会请求服务器2次,一次访问,产生一个TPS,产生2个QPS。
系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间
- QPS(TPS):(Query Per Second)每秒钟请求/事务 数量
- 并发数: 系统同时处理的请求/事务数
- 响应时间: 一般取平均响应时间
吞吐量和负载之间的关系:
①上升阶段:吞吐量随着负载的增加而增加,吞吐量和负载成正比;
②平稳阶段:吞吐量随着负载的增加而保持稳定,无太大变化或波动;
③下降阶段:吞吐量随着负载的增加而下降,吞吐量和负载成反比;
a1面积越大,说明系统的性能能力越强;
a2面积越大,说明系统稳定性越好;
a3面积越大,说明系统的容错能力越好。
1.3.3 机器性能指标解释
机器性能 | 解释 |
---|---|
CUP利用率(CPU Usage) | CUP 利用率分用户态、系统态和空闲态,CPU利用率是指:CPU执行非系统空闲进程的时间与CPU总执行时间的比率 |
内存使用率(Memory usage) | 内存使用率指的是此进程所开销的内存 |
IO(Disk input/ output) | 磁盘的读写包速率 |
网卡负载(Network Load) | 网卡的进出带宽,包量 |
1.3.4 访问指标解释
访问 | 解释 |
---|---|
PV(页面浏览量 Page View) | 用户每打开1个网站页面,记录1个PV。用户多次打开同一页面,PV值累计多次 |
UV(网站独立访客 Unique Visitor) | 通过互联网访问、流量网站的自然人。1天内相同访客多次访问网站,只计算为1个独立访客 |
1.4 如何计算压测指标
压测我们需要有目的性的压测,这次压测我们需要达到什么目标(如:单台机器的性能为 100QPS?网站能同时满足100W人同时在线)
可以通过以下计算方法来进行计算:
- 压测原则:每天80%的访问量集中在20%的时间里,这20%的时间就叫做峰值
- 公式:
(总PV数×80%) / (每天的秒数×20%) = 峰值时间每秒钟请求数(QPS)
- 机器:峰值时间每秒钟请求数(QPS) / 单台机器的QPS = 需要的机器的数量
- 假设:网站每天的用户数(100W),每天的用户的访问量约为3000W PV,这台机器的需要多少QPS?
( 30000000×0.8 ) / (86400×0.2) ≈ 1389 (QPS) - 假设:单台机器的的QPS是69,需要需要多少台机器来支撑?
1389 / 69 ≈ 20
二、常见的压测工具
- wrk
- locust
- jmeter
- Apache Bench
- go-stress-testing
- 云压测
2.1 ab
2.1.1 简介
Apache Bench 是 Apache服务器自带的一个web压力测试工具,简称ab。ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。
开发语言:C
优点:
- ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标
- 并发创建多线程
缺点:
- 没有图形化结果,不能监控
- ab属于一个轻量级的压测工具,结果不会特别准确,可以用作参考
2.1.2 安装
# 在linux环境安装
sudo yum -y install httpd
2.1.3 用法
Usage: ab [options] [http[s]://]hostname[:port]/path
用法:ab [选项] 地址
选项:
Options are:
-n requests #执行的请求数,即一共发起多少请求。
-c concurrency #请求并发数。
-s timeout #指定每个请求的超时时间,默认是30秒。
-k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。
更多参数参考:Apache Bench官方文档
2.1.4 压测命令实例
# 使用ab压测工具,对百度的链接 请求100次,并发数1
ab -n 100 -c 1 https://www.baidu.com/
2.2 Locust
2.2.1 简介
locust 是非常简单易用、分布式、python开发的压力测试工具。有图形化界面,支持将压测数据导出。locust是完全基于事件的,因此可以在单台机器中支持数以千计的用户在线。和其它基于事件的程序相比较,它是不需要使用回调的,它通过gevent使用轻量级的进程。
开发语言:Python
优点:
- 使用协程并发,能够支持更多的并发
- 有UI界面,测试结果展示更加直观
- python语言开发,构建复杂测试学习成本较低
- 支持分布式,可以支持更多的并发量
缺点:
- 测试报告不够丰富
2.2.2 安装
# pip3 安装locust
pip3 install locust
# 查看是否安装成功
locust -h
# 运行 Locust 分布在多个进程/机器库
pip3 install pyzmq
# webSocket 压测库
pip3 install websocket-client
2.2.2 用法
用法详见:Locust性能自动化—代码实战
2.3 wrk
2.3.1 简介
wrk是轻量化的http性能测试工具,采用线程+网络异步IO模型,网络异步IO可以使得系统使用很少的线程模拟大量的网络连接以增大并发量、提高压力。并且内置了一个可选的LuaJIT脚本执行引擎,可以处理复杂的HTTP请求生成、响应处理以及自定义压测报告。
开发语言:C
优点:
- 安装包小巧,只有3M
- 操作简单,易于使用
缺点:
- 没有UI界面
- 复杂场景需要表写lua脚本,有一定的学习成本
- 只允许单机不支持分布式
2.3.2 安装
# Mac下安装:
brew install wrk
2.3.3 用法
-c --conections:保持的连接数
-d --duration:压测持续时间(s)
-t --threads:使用的线程总数
-s --script:加载lua脚本
-H --header:在请求头部添加一些参数
--latency 打印详细的延迟统计信息
--timeout 请求的最大超时时间(s)
2.3.4 压测命令实例
wrk -t8 -c100 -d30s --latency http://127.0.0.1:8080/api/v1/posts?size=10
2.4 JMeter
2.4.1 简介
jmeter是一个使用Java开发的Apache开源软件,用于软件的性能评估和压力测试。它最初是为测试Web应用程序而设计的,但此后又扩展到其他测试功能。
jmeter可用于静态和动态资源、Web动态应用程序的性能测试,例如:HTTP、 HTTPS、LDAP、TCP、FTP、SMTP、POP3、IMAP、Shell脚本、数据库、Java 对象,也可以用于对服务器、服务器组、网络或对象上的巨大负载,以测试在不同强度的压力测试下它们的强度和整体性能。
jmeter同样采用线程并发机制,但其主要依靠增加线程数提高并发量,当单机模拟数以千计的并发用户时,对于CPU和内存的消耗比较大。
开发语言:Java
优点:
- 界面可视化操作,可以使用录制脚本方式对较为复杂的用户流建模
- 表格、图形、结果树等多类可视化数据分析和报告输出
- 支持http、ftp、tcp等多种协议类型测试
- 插件丰富
- 支持分布式
缺点:
- 学习成本大
- 单机并发量不高
- 资源消耗大:GUI模式消耗资源较大,当需要测试高负载时,需要先使用GUI工具来生成XML测试计划,然后在非GUI模式下导入测试计划运行测试
2.4.2 安装
访问https://jmeter.apache.org/download_jmeter.cgi下载解压以后即可使用
# Mac命令行安装
brew install jmeter
# 搜索当前是否已经安装jmeter
brew search jmeter
# 查看具体的包信息
brew info jmeter
# 启动jmeter
jmeter
2.4.3 用法
JMeter的功能过于强大,往上使用教程也很多,大家可以自己查找
2.5 go-stress-testing
2.5.1 简介
go-stress-testing 是go语言实现的简单压测工具,源码开源,9000start、支持二次开发,可以压测http、webSocket请求,使用协程模拟单个用户,可以更高效的利用CPU资源。
开发语言: Go
优点:
- 项目开源,使用简单
- 没有依赖,支持webSocket压测
- 单机并发数高
缺点:
- 没有UI界面
- 不够成熟
2.5.2 用法
下载地址:https://github.com/link1st/go-stress-testing/releases
clone 项目源码运行的时候,需要将项目 clone 到 $GOPATH 目录下
#支持参数:
Usage of ./go-stress-testing-mac:
-c uint #并发数 (default 1)
-n uint #请求数(单个并发/协程) (default 1)
-u string #压测地址
-d string #调试模式 (default "false")
-http2 #是否开http2.0
-k #是否开启长连接
-m int #单个host最大连接数 (default 1)
-H value #自定义头信息传递给服务器 示例:-H 'Content-Type: application/json'
-data string #HTTP POST方式传送数据
-v string #验证方法 http 支持:statusCode、json webSocket支持:json
-p string #curl文件路径
-n 是单个用户请求的次数,请求总次数 = -c* -n, 这里考虑的是模拟用户行为,所以这个是每个用户请求的次数
2.5.3 压测命令实例
# 查看用法
./go-stress-testing-mac
# 使用请求百度页面
./go-stress-testing-mac -c 1 -n 100 -u https://www.baidu.com/
# 使用debug模式请求百度页面
./go-stress-testing-mac -c 1 -n 1 -d true -u https://www.baidu.com/
# 使用 curl文件(文件在curl目录下) 的方式请求
./go-stress-testing-mac -c 1 -n 1 -p curl/baidu.curl.txt
# 压测webSocket连接
./go-stress-testing-mac -c 10 -n 10 -u ws://127.0.0.1:8089/acc
完整压测命令示例:
# 更多参数 支持 header、post body
go run main.go -c 1 -n 1 -d true -u 'https://page.aliyun.com/delivery/plan/list' \
-H 'authority: page.aliyun.com' \
-H 'accept: application/json, text/plain, */*' \
-H 'content-type: application/x-www-form-urlencoded' \
-H 'origin: https://cn.aliyun.com' \
-H 'sec-fetch-site: same-site' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-dest: empty' \
-H 'referer: https://cn.aliyun.com/' \
-H 'accept-language: zh-CN,zh;q=0.9' \
-H 'cookie: aliyun_choice=CN; JSESSIONID=J8866281-CKCFJ4BUZ7GDO9V89YBW1-KJ3J5V9K-GYUW7; maliyun_temporary_console0=1AbLByOMHeZe3G41KYd5WWZvrM%2BGErkaLcWfBbgveKA9ifboArprPASvFUUfhwHtt44qsDwVqMk8Wkdr1F5LccYk2mPCZJiXb0q%2Bllj5u3SQGQurtyPqnG489y%2FkoA%2FEvOwsXJTvXTFQPK%2BGJD4FJg%3D%3D; cna=L3Q5F8cHDGgCAXL3r8fEZtdU; isg=BFNThsmSCcgX-sUcc5Jo2s2T4tF9COfKYi8g9wVwr3KphHMmjdh3GrHFvPTqJD_C; l=eBaceXLnQGBjstRJBOfwPurza77OSIRAguPzaNbMiT5POw1B5WAlWZbqyNY6C3GVh6lwR37EODnaBeYBc3K-nxvOu9eFfGMmn' \
-data 'adPlanQueryParam=%7B%22adZone%22%3A%7B%22positionList%22%3A%5B%7B%22positionId%22%3A83%7D%5D%7D%2C%22requestId%22%3A%2217958651-f205-44c7-ad5d-f8af92a6217a%22%7D'
使用 curl文件进行压测:
# 使用 curl文件(文件在curl目录下) 的方式请求
go run main.go -c 1 -n 1 -p curl/baidu.curl.txt #cur文件在项目目录下的curl/baidu.curl.txt中
2.6 云压测
云压测就是将压测脚本部署在云端,通过云端对对我们的应用进行全方位压测,只需要配置压测的参数,无需准备实体机,云端自动给我们分配需要压测的云主机,对被压测目标进行压测。
优点:
- 轻易的实现分布式部署
- 能够模拟海量用户的访问
- 流量可以从全国各地发起,更加真实的反映用户的体验
- 全方位的监控压测指标
- 文档比较完善
缺点:
- 款商业产品在使用的时候自然还是需要收费的,而且价格还是比较昂贵的
阿里云 性能测试 PTS:
PTS(Performance Testing Service)是面向所有技术背景人员的云化测试工具。有别于传统工具的繁复,PTS以互联网化的交互,提供性能测试、API调试和监测等多种能力。
腾讯云 压测大师 LM:
通过创建虚拟机器人模拟多用户的并发场景,提供一整套完整的服务器压测解决方案。
三、压测工具对比
ab | wrk | locust | jmeter | go-stress-testing | |
---|---|---|---|---|---|
支持分布式 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
开发语言 | Java | C | Python | Java | Go |
并发机制 | 线程 | 线程 | 协程 | 线程 | 协程 |
单机并发能力 | 低 | 较高 | 高 | 低 | 高 |
测试脚本语言 | 无 | Lua | Python | GUI | Go |
报告与分析 | 简单结果 | 简单结果 | 简单图形化 | 丰富图表 | 简单结果 |
四、不常用压测工具
1、LoadRunner: 大而全,要学精通还是有点难度,重量级工具
2、WAS:是Microsoft提供的免费的Web负载压力测试工具
3、Web bench: 一个简单的web基准指标测试工具
4、Load UI: 一款开源的压力测试工具,支持图形化文章来源:https://www.toymoban.com/news/detail-546522.html
参考文档:https://github.com/link1st/go-stress-testing#21-%E5%8E%8B%E6%B5%8B%E6%98%AF%E4%BB%80%E4%B9%88文章来源地址https://www.toymoban.com/news/detail-546522.html
到了这里,关于常用压测工具对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!