在项目正式上线之前,通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug。
目录
压测的概念
- 压测,即压力测试,是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。
- 压测主要检测服务器的承受能力,包括用户承受能力(多少用户同时玩基本不影响质量)、流量承受等。
- 压测的目的就是通过压测(模拟真实用户的行为),测算出机器的性能(单台机器的QPS),从而推算出系统在承受指定用户数(100W)时,需要多少机器能支撑得住
- 压测是在上线前为了应对未来可能达到的用户数量的一次预估(提前演练),压测以后通过优化程序的性能或准备充足的机器,来保证用户的体验。
压测相关术语
压测名词/相关术语
当进行压力测试和性能测试时,以下是一些常见的相关术语的详细解释:
-
压力测试(Stress Testing): 压力测试是用于测试系统在高负载条件下的性能。通过模拟大量并发用户和增加负载,压力测试旨在评估系统在极限负载下的稳定性和可靠性。此测试有助于发现系统在承受大负载时是否能够正常运行,是否存在性能瓶颈和潜在的崩溃点。
-
性能测试(Performance Testing): 性能测试是用于测试系统在不同负载条件下的性能。性能测试旨在评估系统在各种工作负载下的性能表现,包括响应时间、吞吐量、资源利用率等。通过性能测试,可以了解系统的性能状况,发现潜在的性能问题,并为容量规划和性能优化提供参考。
-
并发用户数(Concurrent Users): 并发用户数是指在同一时间内同时访问系统的用户数量。在压力测试中,通过模拟多个用户同时访问系统,可以测试系统的并发处理能力。
-
吞吐量(Throughput): 吞吐量是指在单位时间内处理的请求数量。通常以每秒请求数(QPS)或事务数(TPS)来衡量系统的吞吐量。高吞吐量表示系统能够有效地处理请求。
-
响应时间(Response Time): 响应时间是指系统对请求作出响应的时间。它包括从请求发出到响应返回的时间间隔。短响应时间表示系统响应迅速,用户体验良好。
-
请求延迟(Request Latency): 请求延迟是指请求发送到服务器并得到响应之间的时间延迟。延迟较小表示请求的处理效率高。
-
并发测试(Concurrency Testing): 并发测试是测试系统在不同并发级别下的性能表现。它可以评估系统在多个并发用户同时访问时的性能和并发处理能力。
-
负载测试(Load Testing): 负载测试是在系统上模拟并发用户,并增加负载以测试系统的性能极限。它可以帮助确定系统在承受高负载时的性能表现和稳定性。
-
压力负载测试(Stress Load Testing): 压力负载测试是在系统上模拟大量并发用户,并逐步增加负载,直到系统达到极限或崩溃。它用于测试系统的极限性能和容量。
-
稳定性测试(Stability Testing): 稳定性测试是在长时间运行和高负载下测试系统,以评估其在持续运行和压力下的稳定性。它有助于发现系统是否能够持续稳定地运行,是否存在内存泄漏或资源耗尽等问题。
-
容量规划(Capacity Planning): 容量规划是根据性能测试结果和预测,规划系统所需的硬件资源和容量。它帮助决定系统的扩展能力和资源投入。
-
性能优化(Performance Tuning): 性能优化是根据性能测试结果,对系统进行优化和调整以提高性能。它包括优化代码、配置、硬件等方面。
-
负载发生器(Load Generator): 负载发生器是用于模拟并发用户并产生负载的工具或设备。它用于执行并发测试和负载测试。
-
性能指标(Performance Metrics): 性能指标是用于衡量系统性能的各种指标,如响应时间、吞吐量、错误率等。这些指标用于评估系统的性能和稳定性。
-
断点测试(Breakpoint Testing): 断点测试是在负载逐渐增加的情况下,找到系统性能崩溃或不稳定的临界点。这有助于确定系统的最大负载能力。
这些术语在压力测试和性能测试中是常用的,并且对于评估系统性能和可靠性非常重要。了解这些术语可以帮助您更好地进行压力测试,并优化系统的性能。
压测名词 | 解释 |
---|---|
并发(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) | 在一次事务中,从发出请求或指令系统做出的反映(响应)的平均时间 |
机器性能 | 解释 |
---|---|
CUP利用率(CPU Usage) | CUP 利用率分用户态、系统态和空闲态,CPU利用率是指:CPU执行非系统空闲进程的时间与CPU总执行时间的比率 |
内存使用率(Memory usage) | 内存使用率指的是此进程所开销的内存。 |
IO(Disk input/ output) | 磁盘的读写包速率 |
网卡负载(Network Load) | 网卡的进出带宽,包量 |
访问指标解释
访问 | 解释 |
---|---|
PV(页面浏览量 Page View) | 用户每打开1个网站页面,记录1个PV。用户多次打开同一页面,PV值累计多次 |
UV(网站独立访客 Unique Visitor) | 通过互联网访问、流量网站的自然人。1天内相同访客多次访问网站,只计算为1个独立访客 |
压测工具
ab
ab全称Apache Bench,是Apache自带的性能测试工具。使用这个工具,只须指定同时连接数、请求数以及URL,即可测试网站或网站程序的性能。
通过ab发送请求模拟多个访问者同时对某一URL地址进行访问,可以得到每秒传送字节数、每秒处理请求数、每请求处理时间等统计数据。
总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。
命令格式
ab [options] [http://]hostname[:port]/path
options:
-n requests 总请求数
-c concurrency 一次产生的请求数,可以理解为并发数
-t timelimit 测试所进行的最大秒数, 可以当做请求的超时时间
-p postfile 包含了需要POST的数据的文件
-T content-type POST数据所使用的Content-type头信息
-n 即requests,用于指定压力测试总共的执行次数。
-c 即concurrency,用于指定的并发数。
-t 即timelimit,等待响应的最大时间(单位:秒)。
-b 即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
-p 即postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
-u 即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
-T 即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain。
-v 即verbosity,指定打印帮助信息的冗余级别。
-w 以HTML表格形式打印结果。
-i 使用HEAD请求代替GET请求。
-x 插入字符串作为table标签的属性。
-y 插入字符串作为tr标签的属性。
-z 插入字符串作为td标签的属性。
-C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。
-H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
-A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
-P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
-X 指定使用的和端口号,例如:"126.10.10.3:88"。
-V 打印版本号并退出。
-k 使用HTTP的KeepAlive特性。
-d 不显示百分比。
-S 不显示预估和警告信息。
-g 输出结果信息到gnuplot格式的文件中。
-e 输出结果信息到CSV格式的文件中。
-r 指定接收到错误信息时不退出程序。
-h 显示用法信息,其实就是ab -help。
使用案例
#使用:-n 表示请求数,-c 表示并发数.
ab -n 100 -c 10 http://www.baidu.com/s
#返回内容:
Server Software: BWS/1.1
##服务器软件和版本
Server Hostname: www.baidu.com
##请求的地址/域名
Server Port: 80
##端口
Document Path: /s
##请求的路径
Document Length: 112435 bytes
##页面数据/返回的数据量
Concurrency Level: 10
##并发数
Time taken for tests: 4.764 seconds
##共使用了多少时间
Complete requests: 100
##请求数
Failed requests: 99
##失败请求 百度为什么失败这么多,应该是百度做了防范
(Connect: 0, Receive: 0, Length: 99, Exceptions: 0)
Total transferred: 11342771 bytes
##总共传输字节数,包含http的头信息等
HTML transferred: 11247622 bytes
##html字节数,实际的页面传递字节数
Requests per second: 20.99 [#/sec] (mean)
##每秒多少请求,这个是非常重要的参数数值,服务器的吞吐量
Time per request: 476.427 [ms] (mean)
##用户平均请求等待时间
Time per request: 47.643 [ms] (mean, across all concurrent requests)
##服务器平均处理时间,也就是服务器吞吐量的倒数
Transfer rate: 2325.00 [Kbytes/sec] received
##每秒获取的数据长度
Connection Times (ms)
min mean[+/-sd] median max
Connect: 22 41 12.4 39 82
##连接的最小时间,平均值,中值,最大值
Processing: 113 386 211.1 330 1246
##处理时间
Waiting: 25 80 43.9 73 266
##等待时间
Total: 152 427 210.1 373 1283
##合计时间
Percentage of the requests served within a certain time (ms)
50% 373
## 50%的请求在373ms内返回
66% 400
## 60%的请求在400ms内返回
75% 426
80% 465
90% 761
95% 930
98% 1192
99% 1283
100% 1283 (longest request)
- 测试某个GET请求接口:
ab -n 10000 -c 100 -t 10 "http://127.0.0.1:8080/api/v1/posts?size=10"
- 测试POST请求接口:
ab -n 10000 -c 100 -t 10 -p post.json -T "application/json" "http://127.0.0.1:8080/api/v1/post"
- 主要关注的测试指标
-
Concurrency Level
并发请求数 -
Time taken for tests
整个测试时间 -
Complete requests
完成请求个数 -
Failed requests
失败个数 -
Requests per second
吞吐量,指的是某个并发用户下单位时间内处理的请求数。等效于QPS,其实可以看作同一个统计方式,只是叫法不同而已。 -
Time per request
用户平均请求等待时间 -
Time per request
服务器处理时间
apache benchmark如何发送post请求并且携带json参数
Apache Benchmark(ab)是一个基准测试工具,用于对Web服务器进行压力测试。它是Apache HTTP服务器的一部分,可以通过命令行使用。
要使用Apache Benchmark发送POST请求并携带JSON参数,您需要创建一个包含JSON数据的文件,并使用ab
命令的-p
选项指定该文件,同时使用-T
选项设置请求的Content-Type为application/json
。以下是具体的步骤:
- 创建包含JSON数据的文件,例如
data.json
:
{
"name": "John Doe",
"age": 30
}
- 使用
ab
命令发送POST请求并携带JSON参数:
ab -n 100 -c 10 -p data.json -T "application/json" -H "Accept: application/json" -H "Content-Type: application/json" http://example.com/api/endpoint
在上面的命令中,我们使用了以下选项:
-n
: 指定要执行的请求总数(本例中为100个请求)。-c
: 指定并发请求数(本例中为10个并发请求)。-p
: 指定POST请求的数据文件(data.json
)。-T
: 指定请求的Content-Type为application/json
。-H
: 指定请求头信息,这里我们指定了接受JSON响应和Content-Type为JSON。http://example.com/api/endpoint
: 指定要测试的目标URL。
请注意,ab
工具是用于简单的基准测试,对于更复杂的测试场景和功能,可能需要使用更专业的压力测试工具。同时,ab
工具不支持直接指定POST请求中的JSON参数,因此需要通过文件来传递JSON数据。
在实际使用中,请根据您的具体需求和测试目标选择合适的压力测试工具。
apache benchmark如何测qps
Apache Benchmark(ab)工具是一个用于进行基准测试和压力测试的命令行工具。虽然ab工具本身不会直接测量QPS(Queries Per Second),但我们可以通过在一段时间内运行ab并根据结果计算得出QPS。
要使用ab工具测量QPS,您可以执行以下步骤:
-
使用ab工具发送请求并记录结果:
ab -n 1000 -c 10 http://example.com/api/endpoint
上述命令将发送1000个请求(
-n 1000
)并使用10个并发连接(-c 10
)进行测试。将http://example.com/api/endpoint
替换为您要测试的目标URL。 -
观察ab输出结果:
ab工具会输出测试的各项指标,其中包括每个请求的处理时间、吞吐量等信息。在输出结果中,关注以下两个指标:-
Requests per second:
表示每秒完成的请求数量,即QPS。这是ab工具计算得出的结果,表示在测试期间平均每秒处理的请求数量。 -
Time per request:
表示每个请求的平均处理时间。除非您希望测量单个请求的处理时间,否则QPS更常用于衡量性能。
-
-
计算QPS:
根据ab输出结果中的Requests per second:
项,可以得出测试期间的平均QPS。例如,如果Requests per second:
显示为5000,表示系统在测试期间平均每秒处理5000个请求。
请注意,ab工具的测试结果可能受多种因素影响,包括网络延迟、服务器负载等。为了得到更准确的QPS值,建议在稳定的网络环境和负载较低的情况下进行测试,并运行多次测试以取得平均值。
此外,ab工具是一个相对简单的压力测试工具,更复杂的压力测试场景可能需要使用其他专业的性能测试工具。在进行真实的生产环境压力测试时,建议使用更全面和强大的性能测试工具来评估系统性能。
并发是指qps吗
并发和QPS(Queries Per Second)是相关但不完全相同的概念。
并发(Concurrency): 并发是指系统或应用程序在同一时间间隔内同时处理多个任务或请求的能力。在并发中,可以同时存在多个正在执行的任务,这些任务可能是同时处理的,也可能是在不同的时间片轮流执行的。并发性是一个系统处理多个任务的能力,而不是单纯的吞吐量指标。
QPS(Queries Per Second): QPS是指在一秒钟内处理的请求数量,通常用于衡量一个系统或应用程序的性能。QPS是一个与时间相关的指标,表示在一秒钟内系统可以处理的请求数量。QPS是性能测试中常用的指标之一,用于评估系统的处理能力和性能水平。
在压力测试和性能测试中,常常会使用并发和QPS两个指标来评估系统的性能。并发用于描述系统处理多个请求的能力,而QPS用于衡量系统每秒处理的请求数量。这两个指标在一起可以提供对系统性能和负载情况的全面了解。
通常情况下,并发越高,系统的QPS也可能会随之增加,因为系统在同一时间内能处理更多的请求。然而,并发与QPS之间并非线性关系,具体取决于系统的设计和性能特点。在性能测试中,我们通常会同时观察并发和QPS指标,并根据系统需求和目标来调整并发水平以及关注QPS是否达到预期的性能目标。
wrk
wrk是一款开源的HTTP性能测试工具,它和上面提到的ab同属于HTTP性能测试工具,它比ab功能更加强大,可以通过编写lua脚本来支持更加复杂的测试场景。
命令参数
-c --conections:保持的连接数
-d --duration:压测持续时间(s)
-t --threads:使用的线程总数
-s --script:加载lua脚本
-H --header:在请求头部添加一些参数
--latency 打印详细的延迟统计信息
--timeout 请求的最大超时时间(s)
使用
使用示例:
wrk -t8 -c100 -d30s --latency http://127.0.0.1:8080/api/v1/posts?size=10
结果:
Running 30s test @ http://127.0.0.1:8080/api/v1/posts?size=10
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 14.55ms 2.02ms 31.59ms 76.70%
Req/Sec 828.16 85.69 0.97k 60.46%
Latency Distribution
50% 14.44ms
75% 15.76ms
90% 16.63ms
99% 21.07ms
198091 requests in 30.05s, 29.66MB read
Requests/sec: 6592.29
Transfer/sec: 0.99MB
go-wrk
go-wrk是Go语言版本的wrk。
安装
在新版本的 go 1.15 go install 如果本地没有 package 会自动从远程下载包,所以是十分方便的
go install github.com/adeven/go-wrk@latest
或go get github.com/adeven/go-wrk
使用
使用方法同wrk类似,基本格式如下:
go-wrk [flags] url
flags:
-H="User-Agent: go-wrk 0.1 bechmark\nContent-Type: text/html;": 由'\n'分隔的请求头
-c=100: 使用的最大连接数
-k=true: 是否禁用keep-alives
-i=false: if TLS security checks are disabled
-m="GET": HTTP请求方法
-n=1000: 请求总数
-t=1: 使用的线程数
-b="" HTTP请求体
-s="" 如果指定,它将计算响应中包含搜索到的字符串s的频率
执行测试:
go-wrk -t=8 -c=100 -n=10000 "http://127.0.0.1:8080/api/v1/posts?size=10"
Jmeter
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。
JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。
中文文档:https://jmeter.xiniushu.com/
压测工具的比较
- | ab | locust | Jmeter | go-stress-testing | 云压测 |
---|---|---|---|---|---|
实现语言 | C | Python | Java | Golang | - |
UI界面 | 无 | 有 | 有 | 无 | 无 |
优势 | 使用简单,上手简单 | 支持分布式、压测数据支持导出 | 插件丰富,支持生成HTML报告 | 项目开源,使用简单,没有依赖,支持webSocket压测 | 更加真实的模拟用户,支持更高的压测力度 |