ab压测Swoole必须加-k参数启用Keep-Alive,否则因短连接导致QPS虚低;WebSocket需用协程客户端或JMeter;真实指标只信$server->stats();Xdebug profiling需在onWorkerStart中按PID独立启用。

别用 ab 不加 -k 测 Swoole,QPS 虚低不是框架问题,是连接方式错了。
ab 压测 HTTP 服务必须加 -k 参数
ab 默认走短连接,每次请求都经历 TCP 三次握手 + 四次挥手 + TLS 握手(如果启用了 HTTPS),在高并发下内核 TIME_WAIT 积压、端口耗尽、CPU 花在握手而非业务上。现象是 QPS 卡在几百,ulimit -n 没调够时甚至连不上 1000 并发。
正确命令只有一条:
ab -n 10000 -c 100 -k http://127.0.0.1:9501/
关键点:
-
-k启用 HTTP Keep-Alive,复用底层 TCP 连接 - 服务端必须关闭
http_compression(设为false),否则 gzip 吃满 CPU - 禁止在
onRequest中调用$response->write(),ab 不支持 chunked 编码,会截断或报错 - 测试前执行
ulimit -n 65535,否则客户端无法发起足够连接
WebSocket 服务不能用 ab,得用协程客户端或 JMeter
ab 是纯 HTTP 工具,根本不理解 WebSocket 协议的 Upgrade 流程和帧格式,直接跑会返回 400 或连接拒绝。
真实可用方案只有两个:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 自己写协程压测脚本:用
Swoole\Coroutine\Http\Client,手动完成Upgrade请求,再用push()/recv()发送接收帧。注意控制并发数(如go启动 1000 个协程),避免单机打爆自己 - JMeter + WebSocket Plugin:添加
WebSocket Open Connection、WebSocket Single Write Sampler等采样器,支持登录态、消息体参数化、连接池复用,适合多步骤长链路场景
别用 Python 的 requests + threading 自写——默认无连接复用,GIL 锁死并发,数据完全不可信。
看真实指标只能信 Swoole\Server::stats()
top 里的 CPU%、ps aux 的内存占用都是误导项。Swoole worker 是常驻进程,内存不释放正常,CPU% 也不反映协程调度真实开销。
唯一可信的是它自己暴露的运行时状态:
-
$server->stats()返回数组,含connection_num、accept_count、close_count、tasking_num等字段 - 如果
accept_count增速远低于你发的请求数,说明连接被拒——查max_connection配置或ulimit -n - 如果
tasking_num持续 > 0 且不下降,大概率是onTask里写了sleep()、file_get_contents()这类同步阻塞操作 - 注意:该方法返回的是当前 worker 进程视角的数据,多 worker 下需汇总各进程结果
性能分析别硬上 Xdebug profiling
Xdebug 在 Swoole 常驻进程模型下极易失效:profile 文件被覆盖、根本没生成、或解析为空,常见错误是 Xdebug: [Profiler] Cannot start profiling: no filename given。
真要上,必须满足三个条件:
- php.ini 显式配置
xdebug.mode=profile,不能依赖start_with_request=yes - 在
onWorkerStart回调中调用xdebug_start_profiling('/tmp/prof-'.getmypid()),确保每个 worker 独立采样 - 绝对不要在
go()协程里调用 profiling 函数,Xdebug 不感知协程上下文,会崩溃或漏采 - 单次采样严格控制在 30–60 秒内,否则文件可达 GB 级,
/tmp写满或解析失败
更轻量的替代路径是先用 $server->stats() 定位异常维度(比如 task 积压),再结合 perf record -g -p $(pgrep php) 抓火焰图,看 CPU 真实热点在哪——这点比盲目开 Xdebug 实用得多。


















