真正能暴露生产级瓶颈的Golang微服务压测工具是wrk、vegeta、ghz和Locust;其中wrk需加-H "Connection: Close"禁用KeepAlive,vegeta和ghz默认禁用KeepAlive且支持细粒度连接控制,Locust需手动禁用requests连接池,所有工具压测前均须清空page cache、触发GC并关闭日志。

能测 Golang 微服务的压力测试工具不少,但真正能暴露生产级瓶颈(比如 accept 队列溢出、TIME_WAIT 泛滥、连接池打满)的,其实就那么几个:wrk、vegeta、ghz、Locust。JMeter 虽然能用,但默认开启 KeepAlive、资源开销大、脚本维护重,容易掩盖真实问题。
wrk 测 Go 服务必须关 KeepAlive 才算真压测
wrk 默认使用 HTTP/1.1 长连接,这对测“单接口吞吐极限”很友好,但会绕过 Go 服务端的连接管理逻辑——你看到的高 QPS 可能只是复用连接的结果,不是服务端真实扛住的能力。
- 务必加
-H "Connection: Close"强制短连接,否则测不到net.ListenConfig的LimitListener是否生效、http.Server.ReadTimeout是否触发 - 线程数
-t建议设为 CPU 核数的 1–2 倍;并发数-c要逐步加,别一上来就-c 5000,Go 的net/http默认MaxConnsPerHost是 100,客户端连不上是常态 - 不支持 gRPC;HTTP/2 需手动编译启用,且 Go 服务端要显式配置
http2.ConfigureServer,否则 fallback 到 HTTP/1.1 后行为不可控
Locust 适合测用户行为链路,但得自己管好连接生命周期
Locust 的核心价值是用 Python 写真实业务流(比如登录 → 查商品 → 加购 → 下单),但它默认用 requests 库,而 requests.Session 默认复用连接——这和 wrk 一样,会掩盖服务端连接瓶颈。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 必须在
HttpUser初始化时禁用连接池:self.client.pool_connections = 0; self.client.pool_maxsize = 0 - 每个 task 里发请求前,手动创建新 session 或显式设置
headers={"Connection": "Close"} - 想测 gRPC?得自己集成
grpcio并重写task,不能依赖HttpUser;WebSocket 测倒是原生支持,但要注意websocket-client的心跳和重连策略是否匹配你的服务端 - 分布式启动时,各 worker 进程的
time.time()不同步,如果压测脚本里有基于时间的限流逻辑(比如每秒最多调 5 次),结果会失真
vegeta 和 ghz 是 Go 微服务压测的隐藏主力
vegeta(HTTP)和 ghz(gRPC)是 Go 生态里最贴近生产实况的工具,它们默认禁用 KeepAlive、支持细粒度连接控制、输出带错误码分布,而且命令行参数直白。
-
vegeta压测时加-insecure(HTTPS 场景)、-timeout 5s(避免卡死)、-rate 100(QPS 控制比-connections更稳) -
ghz测 gRPC 必须传--call指定方法全路径,metadata 要写成--metadata "auth=token",否则服务端收不到 - 二者都不支持“模拟登录态后持续复用 token”,得自己写 shell 脚本先调登录接口取 token,再喂给 vegeta/ghz 的
-body或--data - vegeta 输出的 CSV 里
latency字段单位是纳秒,直接导入 Grafana 会错位,需除以 1e6 转毫秒
最容易被忽略的一点:无论用哪个工具,压测机和服务端必须分离,且每次压测前清空服务端 page cache、手动触发 runtime.GC()、关闭日志输出——否则你看到的 P99 延迟,可能只是磁盘 I/O 或 GC STW 的噪音。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










