一句话:用 Go 实现的 go-wrk 对 HTTP 接口做短时高并发压测,本地直连与经 Nginx/域名访问结果差异巨大。

写在前面

想给博客接口做压力测试时,工具很多(ab、wrk、k6、hey)。当时在学 Go,选了 go-wrk——语法类似 wrk,用 goroutine 打并发,安装一条命令即可。本文记录安装、参数与一次真实对比测试。

核心内容

安装

需已安装 Go 环境:

go install github.com/tsliwowicz/go-wrk@latest

安装后确保 $GOPATH/bin$HOME/go/binPATH 中,终端执行 go-wrk -help 验证。

基本用法

go-wrk [选项] <url>

常用参数

参数 说明 默认值
-c 并发 goroutine 数 10
-d 测试持续时间(如 5s30s
-M HTTP 方法 GET
-H 自定义请求头
-body 请求体字符串
-T 超时(毫秒) 1000
-http 是否使用 HTTP/2 true

示例:80 并发、持续 5 秒:

go-wrk -c 80 -d 5 http://localhost:9600/api/v1/third/gushici

带 POST 与 Header:

go-wrk -M POST -H "Authorization: Bearer xxx" -body '{"id":1}' -c 50 -d 10s http://localhost:9600/api/v1/xxx

测试结果对比

直连本机(绕过域名与部分网关限制):

Running 5s test @ http://localhost:9600/api/v1/third/gushici
  80 goroutine(s) running concurrently
12797 requests in 5.010112438s, 6.94MB read
Requests/sec:           2554.23
Transfer/sec:           1.39MB
Avg Req Time:           31.320543ms
Fastest Request:        25.5602ms
Slowest Request:        134.7137ms
Number of Errors:       0

经 HTTPS 域名(生产 Nginx 限流/防护):

Running 5s test @ https://jiang-xia.top/x-zone/api/v1/third/gushici
210 requests in 235.165583ms, 126.05KB read
Requests/sec:           892.99
Number of Errors:       12140
指标 localhost 域名 HTTPS
RPS ~2554 ~893(且大量失败)
错误数 0 12140
平均延迟 ~31ms ~90ms(最慢 3.6s)

踩坑与注意

  1. 压测目标要选对接:测应用性能应直连后端端口;测全链路才走域名 + Nginx + CDN。
  2. Nginx limit_req / 连接数限制:高并发下会返回 503/429,错误数飙升不代表应用扛不住,可能是网关先拦了。
  3. 勿对生产环境猛打-c 80 持续打公网接口可能触发云厂商 DDoS 防护或封 IP;应在预发或本地测。
  4. HTTP/2:默认开启,若老接口异常可试 -http=false 对比。
  5. go-wrk 功能少于 k6:无脚本化场景、无分布式;复杂业务流建议 k6 或 wrk + lua。

小结

go-wrk 适合 快速验证单接口 QPS 与延迟。本次测试说明:博客接口本机约 2500+ RPS;经 Nginx 限流后公网压测大量失败,防护配置生效。压测结论务必写明「打的是哪一层」。

延伸阅读