压测对象应是go服务而非语言环境;go test -bench仅测纯内存逻辑,不反映真实qps;http压测应使用hey或vegeta等真实tcp请求工具,并正确配置http.transport参数。

别把“Golang语言环境搭建”本身当压测对象——它不接受请求、不处理并发、不产生延迟。你真正要测的,是用 Go 写的服务(HTTP 接口、Redis 客户端、gRPC 服务等)在当前环境下的承载能力。
go test -bench 不是压力测试,别用它测接口
很多人跑 BenchmarkHTTPHandler 就以为压测完成了,结果上线后完全对不上。原因很直接:httptest.NewRecorder 绕过了 TCP、TLS、DNS、连接池、反向代理、甚至 net/http 的 server loop,只跑了 handler 函数那一小段内存逻辑。
- 它适合测 JSON 解析、加解密、模板渲染这类纯 CPU/内存操作
- 一旦涉及数据库查询、HTTP 外调、中间件链路,
ns/op和真实 QPS 完全无关 - 必须加
b.ResetTimer(),否则初始化开销(如httptest.NewRequest)全算进去了 - 禁用
time.Sleep和log.Printf,I/O 会严重干扰计时
压测 HTTP 接口,优先用 hey 或 vegeta
这两个工具都是 Go 写的命令行压测器,不用写代码就能打出真实 TCP 请求,且输出指标可直接用于定位瓶颈。
-
hey更轻量:安装推荐下载预编译二进制(wget https://storage.googleapis.com/hey-releases/hey_linux_amd64),避免go install卡在 GOPROXY -
-c是并发 worker 数,-q是每个 worker 每秒最大请求数;真实 QPS ≈-c × -q,但受服务端吞吐和网络限制 -
vegeta更适合 CI:支持-ramp阶梯加压、JSON 输入、vegeta plot生成图表,安装用go install github.com/tsenart/vegeta@latest - 两者都建议加
-disable-keepalive(即设req.Close = true),否则会掩盖服务端 accept 队列或 TIME_WAIT 积压问题
手写 goroutine 压测脚本,四个 Transport 参数必须显式配置
直接用 http.Get 或裸起 goroutine 发请求,大概率不是服务扛不住,而是客户端先崩了:DNS 不复用、连接爆炸、TLS 握手堆积、too many open files。
- 必须配置
http.Transport四个参数,缺一不可:MaxIdleConns和MaxIdleConnsPerHost设为相同值(如 200),IdleConnTimeout(建议 30s),TLSHandshakeTimeout(建议 5–10s) - 用
time.Ticker控制节奏,而不是for i := 0; i —— 后者是瞬发,并非稳态 QPS - 用
sync.WaitGroup等待所有请求完成,避免主 goroutine 提前退出 - 若需模拟冷启动(如测首次访问),才反向禁用复用:
MaxIdleConns = 0、MaxIdleConnsPerHost = 0、IdleConnTimeout = 0
压测 Redis,注意集群与单机连接方式完全不同
用 go-redis 压 Redis,最容易错在连接方式上:单机连错成集群,或集群连成单机,结果静默失败、报错晦涩、性能虚低。
- 单机 Redis:用
redis.NewClient,Addr填"localhost:6379" - Redis 集群:必须用
redis.NewClusterClient,Addrs至少填 2–3 个可连通节点地址(如[]string{"127.0.0.1:7000", "127.0.0.1:7001"}),不能只写一个 - 集群不支持
KEYS *或无游标SCAN,会报CROSSSLOT错误;压测时只用SET/GET等单 key 命令 - 集群客户端初始化失败常因节点未真正运行(
CLUSTER NODES显示 fail)或 Docker 中用了localhost(应改用host.docker.internal)
最常被忽略的一点:压测中不采 pprof,等于白压。QPS 和平均延迟只是表象,真正要查的是 GC 频率、锁竞争、系统调用阻塞、Goroutine 调度延迟——这些只有 curl http://localhost:6060/debug/pprof/profile?seconds=30 才能暴露出来。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











