压测术语
负载
对被测系统不断施加某种特征的压力,直到性能指标超过预期或某项资源使用达到饱和,以验证系统的处理极限,为系统性能调优提供依据;
RPS 每秒发送请求数/吞吐率
RPS:Requests Per Second 意思是 每秒发送请求数/吞吐率。指客户端每秒发出的请求数。在不单独讨论“事务”的情况下可以近似对应到Loadrunner/jmeter的TPS(Transaction Per Second, 每秒事务数)。
QPS 每秒查询
QPS:Queries Per Second 意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS 每秒事务
TPS:是 Transactions Per Second的缩写,也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。一次TPS包含一个请求QPS+一个返回QPS+中间的处理
三者之间的关系:RPS ≈ TPS = sum(QPS)
QPS vs TPS:
QPS基本类似于TPS,但是不同的是:
对于一个页面的一次访问,形成一个TPS;
但一次页面请求,可能产生多次对服务器的请求。服务器对这些请求,就可计入 QPS 之中。如,访问一个页面会请求服务器2次,一次访问,产生一个TPS,产生2个QPS。
最大响应时间 在一次事务中,从发出请求或指令系统做出的反映(响应)的最大时间
最少响应时间 在一次事务中,从发出请求或指令系统做出的反映(响应)的最少时间
平均响应时间 在一次事务中,从发出请求或指令系统做出的反映(响应)的平均时间
并发数 系统同时处理的请求或事务数,反应了系统的负载能力。
吞吐量
指在一次性能测试过程中网络上传输的数据量的总和,也可以这样说在单次业务中,客户端与服务器端进行的数据交互总量
系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间
- QPS(TPS):(Query Per Second)每秒钟请求/事务 数量
- 并发数: 系统同时处理的请求/事务数
- 响应时间: 一般取平均响应时间
吞吐量和负载之间的关系:
①上升阶段:吞吐量随着负载的增加而增加,吞吐量和负载成正比;
②平稳阶段:吞吐量随着负载的增加而保持稳定,无太大变化或波动;
③下降阶段:吞吐量随着负载的增加而下降,吞吐量和负载成反比;
a1面积越大,说明系统的性能能力越强;
a2面积越大,说明系统稳定性越好;
a3面积越大,说明系统的容错能力越好
PV(页面浏览量 Page View)
用户每打开1个网站页面,记录1个PV。用户多次打开同一页面,PV值累计多次
UV(网站独立访客 Unique Visitor)
通过互联网访问、流量网站的自然人。1天内相同访客多次访问网站,只计算为1个独立访客
压测工具
ab
Apache Bench 是 Apache服务器自带的一个web压力测试工具,简称ab。ab又是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。
开发语言:C
优点
● ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标
● 并发创建多线程
缺点:
● 没有图形化结果,不能监控。
● ab属于一个轻量级的压测工具,结果不会特别准确,可以用作参考
wrk
wrk是轻量化的http性能测试工具,采用线程+网络异步IO模型,网络异步IO可以使得系统使用很少的线程模拟大量的网络连接以增大并发量、提高压力。并且内置了一个可选的LuaJIT脚本执行引擎,可以处理复杂的HTTP请求生成、响应处理以及自定义压测报告。
开发语言:C
优点:
● 安装包小巧,只有3M
● 操作简单,易于使用
缺点:
● 没有UI界面
● 复杂场景需要表写lua脚本,有一定的学习成本
● 只允许单机不支持分布式
实战
在实际压测过程中,我曾用一个线程压出过几十万qps,也好奇过为什么一个线程能压出这么高的qps。我们每次请求需要5ms,所以按道理一个线程只能压出200qps,那实际上几百倍的差异是如何来的?后来大致了解到wrk的作者使用了多路复用的技术(epoll,kqueue),每次请求后并不是阻塞等在在那里,而且异步等待结果,同时也可以发起下一个请求,这和redis很像吧,其实wrk的作者代码都是抄的redis的
locust
locust 是非常简单易用、分布式、python开发的压力测试工具。有图形化界面,支持将压测数据导出。locust是完全基于事件的,因此可以在单台机器中支持数以千计的用户在线。和其它基于事件的程序相比较,它是不需要使用回调的,它通过gevent使用轻量级的进程。
开发语言:Python
优点:
● 使用协程并发,能够支持更多的并发
● 有UI界面,测试结果展示更加直观
● python语言开发,构建复杂测试学习成本较低
● 支持分布式,可以支持更多的并发量
缺点:
● 测试报告不够丰富
jmeter
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模式下导入测试计划运行测试
go-stress-testing
go-stress-testing 是go语言实现的简单压测工具,源码开源,9000start、支持二次开发,可以压测http、webSocket请求,使用协程模拟单个用户,可以更高效的利用CPU资源。
开发语言: Go
优点:
● 项目开源,使用简单
● 没有依赖,支持webSocket压测
● 单机并发数高
缺点:
● 没有UI界面
● 不够成熟
云压测
云压测就是将压测脚本部署在云端,通过云端对对我们的应用进行全方位压测,只需要配置压测的参数,无需准备实体机,云端自动给我们分配需要压测的云主机,对被压测目标进行压测。
优点:
● 轻易的实现分布式部署
● 能够模拟海量用户的访问
● 流量可以从全国各地发起,更加真实的反映用户的体验
● 全方位的监控压测指标
● 文档比较完善
缺点:
● 款商业产品在使用的时候自然还是需要收费的,而且价格还是比较昂贵的
● 阿里云 性能测试 PTS
PTS(Performance Testing Service)是面向所有技术背景人员的云化测试工具。有别于传统工具的繁复,PTS以互联网化的交互,提供性能测试、API调试和监测等多种能力。
● 腾讯云 压测大师 LM
通过创建虚拟机器人模拟多用户的并发场景,提供一整套完整的服务器压测解决方案
对比
对比以上提到的五种压测工具:
- | ab | wrk | locust | jmeter | go-stress-testing |
---|---|---|---|---|---|
支持分布式 | 不支持 | 不支持 | 支持 | 支持 | 支持 |
开发语言 | Java | C | Python | Java | Go |
并发机制 | 线程 | 线程 | 协程 | 线程 | 协程 |
单机并发能力 | 低 | 较高 | 高 | 低 | 高 |
测试脚本语言 | 无 | Lua | Python | GUI | Go |
报告与分析 | 简单结果 | 简单结果 | 简单图形化 | 丰富图表 | 简单结果 |
不常用压测工具
● LoadRunner: 大而全,要学精通还是有点难度,重量级工具
● WAS:是Microsoft提供的免费的Web负载压力测试工具
● Web bench: 一个简单的web基准指标测试工具
● Load UI: 一款开源的压力测试工具,支持图形化
压测工具选择原则
在实际使用中有各种场景,选择工具的时候就需要考虑这些:
● 明确你的目的,需要做什么压测、压测的目标是什么?
● 使用的工具你是否熟悉,你愿意花多大的成本了解它?
● 你是为了测试还是想了解其中的原理?
● 工具是否能支持你需要压测的场景