一句话:用 Go 实现的
go-wrk对 HTTP 接口做短时高并发压测,本地直连与经 Nginx/域名访问结果差异巨大。
写在前面
想给博客接口做压力测试时,工具很多(ab、wrk、k6、hey)。当时在学 Go,选了 go-wrk——语法类似 wrk,用 goroutine 打并发,安装一条命令即可。本文记录安装、参数与一次真实对比测试。
核心内容
安装
需已安装 Go 环境:
shell
go install github.com/tsliwowicz/go-wrk@latest
安装后确保 $GOPATH/bin 或 $HOME/go/bin 在 PATH 中,终端执行 go-wrk -help 验证。
基本用法
shell
go-wrk [选项] <url>
常用参数
| 参数 | 说明 | 默认值 |
|---|---|---|
-c |
并发 goroutine 数 | 10 |
-d |
测试持续时间(如 5s、30s) |
— |
-M |
HTTP 方法 | GET |
-H |
自定义请求头 | — |
-body |
请求体字符串 | — |
-T |
超时(毫秒) | 1000 |
-http |
是否使用 HTTP/2 | true |
示例:80 并发、持续 5 秒:
shell
go-wrk -c 80 -d 5 http://localhost:9600/api/v1/third/gushici
带 POST 与 Header:
shell
go-wrk -M POST -H "Authorization: Bearer xxx" -body '{"id":1}' -c 50 -d 10s http://localhost:9600/api/v1/xxx
测试结果对比
直连本机(绕过域名与部分网关限制):
text
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 限流/防护):
text
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) |
踩坑与注意
- 压测目标要选对接:测应用性能应直连后端端口;测全链路才走域名 + Nginx + CDN。
- Nginx
limit_req/ 连接数限制:高并发下会返回 503/429,错误数飙升不代表应用扛不住,可能是网关先拦了。 - 勿对生产环境猛打:
-c 80持续打公网接口可能触发云厂商 DDoS 防护或封 IP;应在预发或本地测。 - HTTP/2:默认开启,若老接口异常可试
-http=false对比。 - go-wrk 功能少于 k6:无脚本化场景、无分布式;复杂业务流建议 k6 或 wrk + lua。
小结
go-wrk 适合 快速验证单接口 QPS 与延迟。本次测试说明:博客接口本机约 2500+ RPS;经 Nginx 限流后公网压测大量失败,防护配置生效。压测结论务必写明「打的是哪一层」。


全部评论(1)