Go压测需禁用HTTP连接复用、用time.Ticker控QPS、原子操作统计指标;推荐hey/vegeta等成熟工具,避免自研客户端资源瓶颈。

Go语言处理海量并发请求下的系统负载压力测试,核心在于用对协程模型、禁用连接复用、控稳请求节奏、准确实时统计。不是“开越多goroutine越猛”,而是让每个请求行为贴近真实用户,同时不被客户端自身资源拖垮。
关键配置:必须禁用HTTP连接复用
默认的http.Client会复用TCP连接、DNS缓存和TLS会话,导致压测结果严重失真——本地跑出5000 QPS,线上可能连1000都不到。真实接口压测需模拟“新用户首次访问”:
- MaxIdleConns = 0:禁用空闲连接池
- MaxIdleConnsPerHost = 0:禁用每主机空闲连接
- IdleConnTimeout = 0:关闭空闲连接超时
- ForceAttemptHTTP2 = false:避免HTTP/2隐式复用
- HTTPS测试可加
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}(仅限测试环境)
并发控制:用time.Ticker实现稳定QPS
只靠goroutine数量(如semaphore)只能控峰值,无法控速率。真实用户是按固定频率发起请求的,比如100 QPS,不是瞬间打100个再等1秒:
- 用
time.NewTicker(time.Second / cfg.RateLimit)生成精准节拍 - 每个worker从ticker channel读信号后发请求,自动补偿耗时波动
- 避免裸写
go http.Get()——那测的是本机网络栈崩溃点,不是服务吞吐
结果统计:原子操作+结构化指标
高并发下普通变量++会竞争,必须用atomic;延迟、错误、成功率等不能只算平均值,还要支持P95/P99分析:
立即学习“go语言免费学习笔记(深入)”;
- 定义
Stats结构体,字段全为int64类型 - 用
atomic.AddInt64(&stats.TotalRequests, 1)安全累加 - 把每次
latency存入切片,结束后排序计算分位值 - 错误率=失败请求数 / 总请求数,响应时间取中位数比平均值更有参考价值
工程建议:别从零手写,优先用成熟工具
业务压测不是练手项目。若非定制需求,推荐直接使用经过验证的工具:
-
hey:轻量简洁,
hey -n 10000 -c 200 -m POST -d '{"x":1}' http://api,输出含QPS、延迟分布、错误率 -
vegeta:支持阶梯增压、自定义body、TLS、报告导出,
vegeta attack -rate=100 -duration=30s | vegeta report - 自研框架上线前,务必搭配
pprof抓goroutine和mutex profile,确认压测客户端没卡在channel阻塞或锁争用上


















