ab只能测workerman的http短连接,因其是纯http客户端,基于阻塞socket逐请求新建并关闭tcp连接,不支持连接复用,而workerman的http worker默认未启用keep-alive处理逻辑,加-k易触发500或断连。

Workerman 的 HTTP 服务可以用 ab 测试,但必须走短连接(HTTP/1.1 默认 keep-alive,ab 不自动复用连接,实际仍是短连),且仅限 HTTP 协议 —— 如果你用的是 Workerman 的 WebSocket、TCP 或自定义协议服务,ab 完全不适用。
为什么 ab 只能测 Workerman 的 HTTP 短连接?
ab 是纯 HTTP 客户端工具,底层基于阻塞 socket + 逐请求发收,不支持长连接复用(即无法维持一个 TCP 连接发多个 HTTP 请求)。它每发一个请求就新建+关闭 TCP 连接(除非显式加 -k,但 Workerman 默认不兼容该行为)。而 Workerman 的高性能恰恰依赖常驻进程 + 连接复用,所以 ab 测出的 QPS 偏低、延迟偏高,反映的是「连接建立开销」而非真实业务处理能力。
常见错误现象:
- 加了
-k但服务返回500或直接断连 —— Workerman 的 HTTP worker 默认未启用 keep-alive 处理逻辑; - 压测时 CPU 使用率很低,但 QPS 上不去 —— 瓶颈在三次握手和 TIME_WAIT,不是 PHP 代码;
- 并发数
-c超过 1000 就报socket: Too many open files—— 客户端文件描述符耗尽,和服务端无关。
ab 命令怎么写才不会报错?
确保 Workerman HTTP 服务已启动并监听 0.0.0.0:56789(示例端口),然后用以下最小可行命令:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ab -n 10000 -c 200 http://127.0.0.1:56789/
关键点:
- URL 末尾必须带
/,否则报ab: invalid URL; - 不要加
-k(keep-alive)—— Workerman 默认 HTTP 响应头不含Connection: keep-alive,硬加会触发连接异常; - 避免用
https——ab不支持 TLS,会直接失败; - 如需 POST,必须同时指定
-p postfile.txt -T "application/x-www-form-urlencoded",只用-H设 Content-Type 会导致 400; - 中文响应体可能乱码,属
ab自身限制,不影响数值结果。
对比 benchmark 工具更准,但 ab 有啥不可替代的用途?
Workerman 自带的 benchmark 工具支持长连接、二进制协议、自定义请求内容,结果更贴近真实场景。但 ab 仍有两个实用价值:
- 快速验证服务是否存活、路由是否通、基础 HTTP 头是否合规(比如
Server、Content-Type); - 横向对比 Nginx / Swoole / Workerman 在相同短连接模型下的原始网络吞吐,排除应用层干扰;
- 当 CI 流程里只能装轻量工具时,
ab比 Python 脚本或 Locust 更易标准化部署。
真正卡在性能瓶颈时,别只盯着 ab 的 Requests per second —— 先看 Time per request (mean) 是否稳定,再查 Workerman 的 status 输出里 connections 和 worker_status 是否堆积,最后确认系统级指标(ss -s 看 socket 状态,dmesg | tail 看 OOM killer 是否介入)。










