性能测试
本文引用的文件
- bench/README.md
- bench/k6_short.js
- bench/k6_stream.js
- bench/run_host_regression.sh
- examples/stream-bench-app.php
- examples/websocket_echo_app.php
目录
简介
本指南面向使用 k6 对 VHTTPD 进行 HTTP、WebSocket、流式响应(SSE/文本流)的性能测试与基准测试。文档覆盖: - HTTP 短请求并发、响应时间监控与吞吐评估 - WebSocket 连接建立、消息往返与资源清理验证 - SSE 与文本流的稳定性与可扩展性评估 - 回归脚本的一键执行流程与结果对比方法 - 结果分析与优化建议
项目结构
与性能测试直接相关的代码位于 bench 目录,以及示例应用 examples 下的流式与 WebSocket 演示应用。
graph TB
subgraph "基准与脚本"
A["bench/README.md"]
B["bench/k6_short.js"]
C["bench/k6_stream.js"]
D["bench/run_host_regression.sh"]
end
subgraph "被测示例应用"
E["examples/stream-bench-app.php"]
F["examples/websocket_echo_app.php"]
end
A --> B
A --> C
A --> D
D --> B
D --> C
C --> E
B --> E
F -.->|"用于手动或扩展测试"| D
图表来源 - bench/README.md:1-158 - bench/k6_short.js:1-44 - bench/k6_stream.js:1-52 - bench/run_host_regression.sh:1-130 - examples/stream-bench-app.php:1-88 - examples/websocket_echo_app.php:1-240
章节来源 - bench/README.md:1-158
核心组件
- k6 短请求基准脚本:定义场景、阈值与断言,适合压测常规 HTTP 接口。
- k6 流式基准脚本:针对 SSE 与文本流,设置较长超时与数据完整性检查。
- 一键回归脚本:构建并启动 vhttpd,运行短请求与流式基准,校验进程生命周期与 worker 清理。
- 流式基准应用:提供 /bench/health 与 /bench/stream(支持 sse/text),参数化 tokens、interval_ms、chunk_size。
- WebSocket 回声示例:提供 /ws 端点与 echo 逻辑,可用于扩展 WebSocket 性能测试。
章节来源 - bench/k6_short.js:1-44 - bench/k6_stream.js:1-52 - bench/run_host_regression.sh:1-130 - examples/stream-bench-app.php:1-88 - examples/websocket_echo_app.php:1-240
架构总览
下图展示从 k6 到 vhttpd 再到 PHP Worker 的端到端调用路径,适用于 HTTP 与流式场景;WebSocket 场景可参考“详细组件分析”中的时序图。
sequenceDiagram
participant K as "k6 客户端"
participant H as "vhttpd 服务"
participant W as "php-worker(示例应用)"
K->>H : "HTTP GET /bench/health 或 /bench/stream"
H->>W : "转发请求至 PHP Worker"
W-->>H : "返回静态响应或流式事件/文本块"
H-->>K : "完整响应或分块流"
Note over K,H : "k6 收集延迟、失败率、吞吐量等指标"
图表来源 - bench/k6_short.js:32-43 - bench/k6_stream.js:33-51 - examples/stream-bench-app.php:11-87
详细组件分析
HTTP 短请求基准(k6)
- 场景与并发:使用 ramping-vus 逐步提升并发,模拟真实流量爬坡与回落。
- 阈值与断言:限制失败率、P95/P99 延迟,确保可用性。
- 标签与追踪:为不同端点与 profile 打标签,便于聚合分析。
- 环境变量:通过 VHTTPD_BASE_URL 与 VHTTPD_BENCH_PATH 控制目标地址与路径。
flowchart TD
Start(["开始"]) --> Load["加载配置<br/>VHTTPD_BASE_URL/VHTTPD_BENCH_PATH"]
Load --> Ramp["按阶段提升并发"]
Ramp --> Req["发起 HTTP GET 请求"]
Req --> Check{"状态码=200?"}
Check --> |是| Pass["记录指标并通过断言"]
Check --> |否| Fail["记录失败并触发阈值告警"]
Pass --> Sleep["短暂休眠后继续循环"]
Fail --> Sleep
Sleep --> End(["结束"])
图表来源 - bench/k6_short.js:11-30 - bench/k6_short.js:32-43
章节来源 - bench/k6_short.js:1-44 - bench/README.md:59-77
流式响应基准(SSE/文本流)
- 模式选择:通过 VHTTPD_STREAM_MODE 切换 sse 或 text。
- 路径参数:tokens、interval_ms、chunk_size 控制流长度、间隔与块大小。
- 超时与断言:更长超时,校验响应体包含预期事件或数据片段。
- 推荐矩阵:固定 tokens 变 interval 评估传输开销;固定 interval 变 tokens 评估可扩展性。
flowchart TD
S(["开始"]) --> Env["读取环境变量<br/>MODE/STREAM_PATH"]
Env --> Conn["发起长连接 GET /bench/stream"]
Conn --> Mode{"mode=sse 还是 text"}
Mode --> |sse| SSE["等待 event: token/data: 片段"]
Mode --> |text| TXT["累积文本块直到完成"]
SSE --> Verify{"包含期望片段?"}
TXT --> Verify
Verify --> |是| OK["通过断言并统计耗时"]
Verify --> |否| ERR["标记失败并记录日志"]
OK --> Next["继续下一轮"]
ERR --> Next
Next --> E(["结束"])
图表来源 - bench/k6_stream.js:12-31 - bench/k6_stream.js:33-51 - examples/stream-bench-app.php:42-86
章节来源 - bench/k6_stream.js:1-52 - bench/README.md:79-152 - examples/stream-bench-app.php:1-88
WebSocket 性能测试方案
仓库提供了 WebSocket 回声示例应用,可作为基线能力验证与扩展点。当前未提供专用 k6 WebSocket 脚本,但可基于现有 echo 应用快速实现: - 连接建立:在 k6 中通过自定义模块或外部工具创建 ws 连接,测量握手时延。 - 消息往返:发送固定大小消息,统计往返时延与吞吐。 - 资源清理:关闭连接后确认服务端无泄漏(可复用回归脚本的进程检查思路)。
sequenceDiagram
participant K as "k6 客户端"
participant H as "vhttpd 服务"
participant W as "php-worker(WebSocket 应用)"
K->>H : "HTTP Upgrade -> WS /ws"
H->>W : "升级并路由到 WebSocket 处理器"
W-->>H : "接受连接并回显"
H-->>K : "101 Switching Protocols"
loop 消息往返
K->>H : "WS 帧(文本/二进制)"
H->>W : "转发帧"
W-->>H : "echo 响应帧"
H-->>K : "WS 帧"
end
K->>H : "关闭连接"
H->>W : "通知关闭"
图表来源 - examples/websocket_echo_app.php:224-239
章节来源 - examples/websocket_echo_app.php:1-240
一键主机回归与基准流水线
该脚本负责: - 构建 vhttpd 与相关依赖 - 启动 vhttpd 并等待健康检查就绪 - 依次运行短请求与流式基准 - 优雅停止并验证 worker 进程清理
sequenceDiagram
participant U as "用户"
participant R as "run_host_regression.sh"
participant V as "vhttpd 进程"
participant K as "k6 进程"
U->>R : "执行回归脚本"
R->>R : "构建/准备环境"
R->>V : "启动 vhttpd(带 worker 池)"
R->>R : "轮询 /bench/health 直至就绪"
R->>K : "运行短请求基准"
R->>K : "运行流式基准"
R->>V : "发送 SIGINT 优雅停止"
R->>R : "等待进程退出并检查 worker 泄漏"
R-->>U : "输出日志与事件文件路径"
图表来源 - bench/run_host_regression.sh:18-88 - bench/run_host_regression.sh:90-129
章节来源 - bench/run_host_regression.sh:1-130 - bench/README.md:24-57
依赖关系分析
- 环境变量约定:统一以 VHTTPD_* 前缀命名,兼容旧名。
- 关键变量:
- VHTTPD_BASE_URL:基准目标地址
- VHTTPD_BENCH_PATH:短请求路径
- VHTTPD_STREAM_PATH:流式路径(含 mode/tokens/interval_ms/chunk_size)
- VHTTPD_STREAM_MODE:sse 或 text
- VHTTPD_WORKER_POOL_SIZE:worker 池大小
- VHTTPD_BENCH_RUN_K6:是否运行 k6
- VHTTPD_APP_BOOTSTRAP:示例应用入口
- VHTTPD_HOST/VHTTPD_PORT:服务监听地址与端口
graph LR
ENV["环境变量(VHTTPD_*)"] --> SHORT["k6_short.js"]
ENV --> STREAM["k6_stream.js"]
ENV --> REG["run_host_regression.sh"]
REG --> SHORT
REG --> STREAM
SHORT --> APP["stream-bench-app.php"]
STREAM --> APP
图表来源 - bench/README.md:4-14 - bench/k6_short.js:4-9 - bench/k6_stream.js:4-10 - bench/run_host_regression.sh:12-16
章节来源 - bench/README.md:4-14
性能考量与优化建议
- 并发模型
- 短请求:使用 ramping-vus 模拟爬坡,关注 P95/P99 延迟与失败率阈值。
- 流式:合理设置 timeout,避免长时间阻塞导致 VU 耗尽;根据 tokens 与 interval_ms 调整并发规模。
- 传输开销与可扩展性
- 固定 tokens 变化 interval_ms:评估运行时与网络开销。
- 固定 interval_ms 变化 tokens:评估线性增长与内存占用。
- 资源清理
- 回归脚本在停止后检查 php-worker 进程残留,避免长期运行的资源泄漏影响后续基准。
- 指标采集
- 利用 k6 内置指标(http_req_duration、http_req_failed、checks)与 tags 维度进行聚合分析。
- 环境与隔离
- 使用独立端口与临时目录,避免与其他服务冲突;必要时禁用代理以提升稳定性。
[本节为通用指导,不直接分析具体文件]
故障排查指南
- 服务未就绪
- 现象:健康检查多次失败。
- 处理:查看 stdout 日志,确认 worker 命令路径与 Unix domain socket 支持。
- 进程未正常退出
- 现象:SIGINT 后 vhttpd 未在限定时间内退出。
- 处理:检查信号处理与优雅关闭逻辑,必要时强制终止并排查僵尸进程。
- Worker 泄漏
- 现象:存在遗留的 php-worker 进程。
- 处理:定位 worker 启动参数与 socket 前缀,确认清理逻辑是否生效。
- 流式断言失败
- 现象:响应体不包含期望片段。
- 处理:核对 stream 路径参数(mode/tokens/interval_ms/chunk_size)与应用实现一致性。
章节来源 - bench/run_host_regression.sh:72-88 - bench/run_host_regression.sh:104-129
结论
通过统一的 k6 脚本与一键回归流程,可对 VHTTPD 的 HTTP、SSE/文本流进行稳定、可复现的基准测试。结合推荐的对比矩阵,能够系统评估传输开销与可扩展性。对于 WebSocket,可基于现有回声示例快速扩展压测脚本,完善连接建立、消息往返与资源清理的度量。
[本节为总结性内容,不直接分析具体文件]
附录
常用命令速查
- 安装 k6:参见 README 前置条件。
- 运行短请求基准:参考 README 第 1 节。
- 运行流式基准:参考 README 第 2 节与推荐矩阵。
- 一键回归:参考 README 第 0 节与 run_host_regression.sh。
章节来源 - bench/README.md:16-22 - bench/README.md:59-152 - bench/run_host_regression.sh:1-130