本文目录导读:

针对 Laravel 项目的压测,更推荐使用 wrk,而不是 ab(Apache Bench),以下是详细的原因分析和对比:
wrk:优势巨大,是主流选择,尤其在wrk2版本中,它能提供更精准的延迟分布数据。ab:除非你只是为了测一个“通不通”或环境极度受限(如只装了 Apache),否则不建议用于 Laravel 压测。
为什么 wrk 比 ab 更适合 Laravel?
| 对比维度 | wrk | ab |
|---|---|---|
| 并发模型 | 多线程 + 非阻塞事件驱动,一个线程可以处理大量并发连接,资源开销低。 | 单进程,一个线程对应一个并发连接,高并发下(如数千连接),会触发 fork 出大量进程,远超 wrk 的资源消耗。 |
| 性能瓶颈 | 不会成为测试的瓶颈,它很轻松就能打出几万甚至十几万的 QPS,只要你的 Laravel 能处理。 | 容易成为瓶颈,在高并发场景前,ab 自身 CPU 会先 100%,限制了你测试 Laravel 真实吞吐能力的天花板。 |
| 延迟统计 | 非常强大,能提供延迟标准差、延迟分布(百分位数),且支持 --latency 参数输出详细分布图。 |
非常弱,只给出平均值,看不到 P99、P999 延迟,这对于 Laravel(一个通常有数据库查询、Session 处理的框架)非常重要。 |
| Laravel 特点匹配 | Laravel 启动慢、中间件多、依赖数据库,需要长时间预热和统计。wrk 支持 -d30s 甚至更久的测试,并自动收集延迟分布。 |
ab 默认只跑一次,对于 Laravel 这种慢启动框架,容易测得“启动时间”而非“持续性能”。 |
实战建议:如何使用 wrk 压测 Laravel
安装 wrk
# macOS brew install wrk # Ubuntu/Debian sudo apt-get install build-essential libssl-dev git -y git clone https://github.com/wg/wrk.git wrk cd wrk make sudo cp wrk /usr/local/bin/
基础压测命令(最常用)
wrk -t12 -c400 -d30s --latency http://your-laravel.test/api/test
-t12:使用 12 个线程(建议等于 CPU 核数 * 2)。-c400:保持 400 个并发连接。-d30s:持续压测 30 秒(Laravel 建议至少 30s,避开冷启动)。--latency:输出详细延迟分布(如 P50, P75, P99)。
进阶:使用 Lua 脚本模拟真实用户
Laravel 通常有 Session 或 Token,用 Lua 脚本保持 Cookie:
-- login.lua
wrk.method = "POST"
wrk.body = "email=test@example.com&password=secret"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
response = function(status, headers, body)
if status == 200 then
-- 提取 Set-Cookie 模拟后续请求
wrk.headers["Cookie"] = headers["Set-Cookie"]
end
end
然后运行:
wrk -t4 -c100 -d30s -s login.lua http://your-laravel.test/login
使用 wrk2 获得更精准的延迟
wrk2 可以固定请求速率(RPS),避免测试机自身调度干扰,特别适合测 P99 延迟。
# 安装 wrk2 (基于 wrk 的加强版) git clone https://github.com/giltene/wrk2.git cd wrk2 make sudo cp wrk /usr/local/bin/wrk2 # 固定速率 1000 QPS 测试 wrk2 -t4 -c100 -d30s -R1000 --latency http://your-laravel.test/api
什么时候用 ab?
- 快速验证:
ab -n 1 -c 1 http://...检查接口是否返回 200。 - 环境限制:你的服务器只有 Apache 或
ab工具,没有权限安装wrk。 - 测试静态文件:
ab对静态资源(图片、纯文本)压测足够,因为瓶颈不在延迟分布,而在最大吞吐量。
一个常见的坑
如果你用 ab 压测 Laravel,可能会发现:
- QPS 很低(200 QPS)。
- 服务端 CPU 不高。
这很可能是因为
ab自身成为了瓶颈,而不是 Laravel。
| 场景 | 推荐工具 |
|---|---|
| 正式压测(重点看延迟、QPS) | wrk 或 wrk2 |
| 精确控制请求速率(限流测试) | wrk2 (带 -R 参数) |
| 复杂场景模拟 | wrk + Lua脚本 |
| 快速验证接口是否正常 | ab 或 curl |
| 需要图形化报告(如火焰图) | 配合 k6、vegeta、locust 等(不选 ab/wrk 的原因) |
压测 Laravel,无脑选 wrk 即可,它更现代、更高效,并且能直接给你最有价值的延迟分布数据,帮你找到 Laravel 的慢 SQL 或 N+1 问题。