在进行性能测试时,预请求(Pre-request)是一个非常重要的步骤。它可以帮助我们在正式压测之前,确保系统处于正确的状态。本文将介绍如何使用 ab
(Apache Benchmark)工具进行预请求,并介绍其他常用的压测工具。
1. AB 预请求
ab
是 Apache 提供的一个简单的压测工具,常用于 HTTP 服务的性能测试。在进行正式压测之前,通常需要进行一些预请求,以确保系统已经预热,或者确保某些资源已经加载。
1.1 什么是预请求?
预请求是指在正式压测之前,发送一些请求到目标服务器,以确保系统处于稳定状态。这些请求可以帮助我们:
- 预热服务器,避免冷启动带来的性能影响。
- 确保数据库连接池已经初始化。
- 确保缓存已经加载。
1.2 使用 AB 进行预请求
假设我们要对一个 API 进行压测,首先可以使用 ab
发送一些预请求:
ab -n 100 -c 10 http://example.com/api/
-n 100
:表示发送 100 个请求。-c 10
:表示并发数为 10。
这个命令会发送 100 个请求到 http://example.com/api/
,并发数为 10。通过这种方式,我们可以确保系统已经预热。
1.3 预请求的注意事项
- 请求量:预请求的数量不宜过多,通常几十到几百个请求即可。
- 并发数:并发数可以根据实际情况调整,通常不需要太高。
- 目标接口:预请求的接口应与正式压测的接口一致,以确保系统状态一致。
2. 其他压测工具
除了 ab
,还有许多其他优秀的压测工具,适用于不同的场景。
2.1 JMeter
JMeter 是一个功能强大的开源压测工具,支持多种协议(HTTP、FTP、JDBC 等),并且提供了图形化界面,适合复杂的压测场景。
2.1.1 JMeter 示例
jmeter -n -t test_plan.jmx -l result.jtl
-n
:非 GUI 模式运行。-t test_plan.jmx
:指定测试计划文件。-l result.jtl
:指定结果文件。
2.2 Locust
Locust 是一个基于 Python 的开源压测工具,支持分布式压测,并且可以通过编写 Python 代码来定义用户行为。
2.2.1 Locust 示例
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(1, 2.5)
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_items(self):
for item_id in range(10):
self.client.get(f"/item?id={item_id}", name="/item")
运行 Locust:
locust -f locustfile.py
2.3 wrk
wrk 是一个现代化的 HTTP 压测工具,支持多线程和 Lua 脚本,适合高性能的压测场景。
2.3.1 wrk 示例
wrk -t12 -c400 -d30s http://example.com/api/
-t12
:使用 12 个线程。-c400
:并发数为 400。-d30s
:压测持续时间为 30 秒。