文章目录
一、压测介绍
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:
通过创建虚拟机器人模拟多用户的并发场景,提供一整套完整的服务器压测解决方案。
三、压测工具对比
abwrklocustjmetergo-stress-testing支持分布式不支持不支持支持支持支持开发语言JavaCPythonJavaGo并发机制线程线程协程线程协程单机并发能力低较高高低高测试脚本语言无LuaPythonGUIGo报告与分析简单结果简单结果简单图形化丰富图表简单结果
四、不常用压测工具
1、LoadRunner: 大而全,要学精通还是有点难度,重量级工具
2、WAS:是Microsoft提供的免费的Web负载压力测试工具
3、Web bench: 一个简单的web基准指标测试工具
4、Load UI: 一款开源的压力测试工具,支持图形化
参考文档:https://github.com/link1st/go-stress-testing#21-%E5%8E%8B%E6%B5%8B%E6%98%AF%E4%BB%80%E4%B9%88
版权归原作者 adorable_ 所有, 如有侵权,请联系我们删除。