在项目正式上线之前,我们通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug;压力测试(压测)是确保系统在高负载情况下仍能稳定运行的重要步骤。通过模拟高并发场景,可以评估系统的性能瓶颈、可靠性和稳定性,进而优化系统架构和资源配置。
一、压力测试相关术语
- 响应时间 (
RT
):指系统对请求作出响应的时间。 - 吞吐量 (
Throughput
):指系统在单位时间内处理请求的数量。 QPS
(每秒查询率,Query Per Second):“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。TPS
(Transaction Per Second):每秒钟系统能够处理的交易或事务的数量。- 并发连接数:某个时刻服务器所接受的请求总数。
二、安装wrk
2.1 使用Homebrew 安装
brew install wrk
2.2 编译安装
使用Git 下载源码
# 1. 切换到待安装的目录
cd /usr/local/src
# 2. 免提示(-y), 安装 git
yum install git -y
# 3. 下载 wrk 源码
git clone https://github.com/wg/wrk.git
克隆完成后,进入wrk目录并执行make
命令进行编译。这个命令会编译wrk并生成可执行文件:
# 4. 进入安装文件夹
cd wrk
# 5. 下载 gcc 编译器, 并编译
yum -y install gcc
make
编译成功后,你会得到一个名为wrk
的可执行文件。为了能够在任何目录下运行wrk
,你可以将其移动到系统的PATH
环境变量中的某个目录,或者直接将wrk的目录添加到PATH
环境变量中。如果你不确定如何操作,可以查阅相关的操作系统文档。
在Linux系统中,你可以使用以下命令将wrk添加到PATH
环境变量(假设你的当前用户是user
):
# 6. 创建软连接, 方便全局调用
ln -s /usr/local/src/wrk/wrk /usr/local/bin
2.3 测试是否安装成功
在使用 wrk
之前,你可以通过 wrk --help
命令来查看所有可用的命令行选项。这个命令会输出 wrk
的使用说明和所有支持的参数。
三、wrk 命令基本使用
3.1 常用命令参数
-c, --connections
: 每个线程建立的连接数(并发数)。默认值为 200。-d, --duration
: 测试持续时间,例如2s
、2m
、2h
。默认值为 10 秒。-t, --threads
: 用于执行测试的线程数。默认值为 2。-s, --script
: 指定一个 Lua 脚本来处理自定义请求或响应。-H, --header
: 添加 HTTP 请求头,可以多次使用此参数来添加多个头部。--latency
: 打印详细的延迟统计信息。--timeout
: 设置请求超时时间,默认为无穷大。--body
: 指定请求体,可以是一个文件路径或直接的数据。--rate
: 限制请求速率(每秒请求数),默认不限速。
3.2 执行测试
执行如下命令:
wrk -t1 -d1s -c2 -s ./scripts/wrk/signup.lua http://localhost:8080/users/signup
这个命令是使用 wrk
这个 HTTP 压力测试工具来对本地主机上的一个用户注册接口进行测试。下面是命令中每个部分的解释:
wrk
: 命令的名称,表示执行wrk
工具。-t1
:-t
选项后面跟着的1
表示使用 1 个线程来进行测试。-d1s
:-d
选项后面跟着的1s
表示测试的持续时间是 1 秒。-c2
:-c
选项后面跟着的2
表示每个线程保持 2 个连接打开。-s ./scripts/wrk/signup.lua
:-s
选项后面跟着的路径./scripts/wrk/signup.lua
表示加载一个 Lua 脚本,这个脚本用于自定义请求或处理响应。在这个例子中,脚本可能是用来模拟用户注册的请求。http://localhost:8080/users/signup
: 这是测试的目标 URL,即本地主机上的用户注册接口,监听在 8080 端口。 综合来看,这个命令会使用 1 个线程在 1 秒内对http://localhost:8080/users/signup
接口发起压力测试,每个线程保持 2 个连接,并且使用./scripts/wrk/signup.lua
脚本来自定义请求的内容,可能是模拟用户注册的行为。
3.3 输出结果
输出结果如下:
Running 1s test @ http://localhost:8080/users/signup
1 threads and 2 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 64.63ms 711.72us 67.28ms 90.00%
Req/Sec 29.80 10.76 40.00 80.00%
30 requests in 1.01s, 3.78KB read
Requests/sec: 29.81
Transfer/sec: 3.76KB
这个输出是 wrk
执行完压力测试后的统计结果。下面是对每个部分的解释:
Running 1s test @ http://localhost:8080/users/signup
: 这行显示的是测试的配置,包括测试持续时间(1秒)和测试的目标 URL(本地主机的用户注册接口)。1 threads and 2 connections
: 这行显示的是测试使用的线程数(1个线程)和每个线程建立的连接数(2个连接)。Thread Stats
: 这部分显示的是线程级别的统计信息,包括平均延迟、延迟的标准差、最大延迟以及延迟分布在平均值正负一个标准差内的百分比。Avg
: 平均延迟,这里是 64.63 毫秒。Stdev
: 延迟的标准差,这里是 711.72 微秒。Max
: 最大延迟,这里是 67.28 毫秒。+/- Stdev
: 延迟分布在平均值正负一个标准差内的百分比,这里是 90.00%。Req/Sec
: 这部分显示的是每秒请求数的统计信息,包括平均请求数、请求数的标准差、最大请求数以及请求数分布在平均值正负一个标准差内的百分比。Avg
: 平均每秒请求数,这里是 29.80。Stdev
: 每秒请求数的标准差,这里是 10.76。Max
: 最大每秒请求数,这里是 40.00。+/- Stdev
: 每秒请求数分布在平均值正负一个标准差内的百分比,这里是 80.00%。30 requests in 1.01s, 3.78KB read
: 这行显示的是在测试期间总共完成了 30 个请求,耗时 1.01 秒,读取了 3.78KB 的数据。Requests/sec
: 这显示的是平均每秒完成的请求数,这里是 29.81。Transfer/sec
: 这显示的是平均每秒读取的数据量,这里是 3.76KB。 总结来说,这个测试在 1 秒内使用 1 个线程和 2 个连接对本地主机的用户注册接口进行了压力测试,平均每秒可以完成大约 29.81 个请求,平均延迟大约为 64.63 毫秒。