go test -bench 用于纯 Go 原生压测,聚焦 handler 函数级性能(如 JSON 编解码、DB 查询),绕过网络等干扰,需封装为 BenchmarkXxx(*testing.B) 并循环调用 b.N,避免日志/IO,可用 httptest 构造轻量上下文,-benchmem 默认开启,-benchtime=5s 提升稳定性。

用 go test -bench 快速验证单接口吞吐与分配开销
纯 Go 原生压测不靠第三方工具也能起步,go test -bench 适合验证 handler 函数本身性能(比如 JSON 编解码、DB 查询逻辑),而非完整 HTTP 链路。它绕过网络、TLS、反向代理等干扰,结果反映的是「代码层瓶颈」。
- 必须把待测逻辑封装成
BenchmarkXxx(*testing.B)函数,且在循环中调用b.N次 - 避免在 benchmark 中做
log.Print或写文件——会严重污染结果;用b.ReportAllocs()开启内存统计 - 若 handler 依赖
*http.Request和http.ResponseWriter,需用httptest.NewRequest和httptest.NewRecorder构造轻量上下文 - 注意:
-benchmem是默认开启的,但-benchtime=5s可延长采样时间提升稳定性
用 hey 或 vegeta 做真实 HTTP 接口压测并导出原始数据
Go 生态里 hey(用 Go 写的)和 vegeta(功能更全)是主流选择。它们走真实 TCP 连接,能暴露连接复用、超时、服务端队列堆积等问题,但不会自动生成「报告」——只输出终端 summary 或 JSON 流。
-
hey -n 10000 -c 100 -m POST -d '{"id":1}' http://localhost:8080/api/user:最简压测命令,关注Requests/sec和50th/90th/95th延迟 -
vegeta attack -targets=targets.txt -rate=200 -duration=30s | vegeta report -type=json > report.json:适合自动化集成,report.json包含每秒请求数、延迟分布、状态码计数等字段 - 别直接信终端里显示的平均延迟——它掩盖长尾;重点看
P95和错误率(Non-2xx或Errors字段) - 压测机和被测服务尽量分机器跑,避免 CPU/网络争抢;本地压测
localhost会绕过部分 TCP 栈,结果偏乐观
用 pprof 定位 Go 服务内部热点(CPU / heap / goroutine)
压测中发现延迟高或 QPS 上不去,pprof 是必查环节。它不生成“报告”,但提供可落地的优化线索,比如锁竞争、GC 频繁、协程泄漏。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 启动服务时加
import _ "net/http/pprof",然后访问http://localhost:6060/debug/pprof/查看可用 profile 类型 -
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30:采集 30 秒 CPU profile,进入交互后用top10看耗时函数,web生成调用图 - 内存问题看
/debug/pprof/heap,goroutine 泄漏看/debug/pprof/goroutine?debug=2(显示全部栈) - 注意:生产环境开启
/debug/pprof有安全风险,建议通过内网地址暴露,或用pprof.Lookup("xxx").WriteTo(...)手动 dump
拼装定制化压测报告的关键字段和常见陷阱
所谓“API 性能压测报告”,本质是把 hey/vegeta 的原始输出 + pprof 分析结论 + 业务指标(如 DB 耗时、缓存命中率)对齐时间窗口后整合。没有通用模板,但几个字段常被忽略却决定结论可信度:
- 必须标注压测时的服务配置:GOMAXPROCS 值、GC 开关(
GODEBUG=gctrace=1)、是否启用http.Transport连接池(MaxIdleConns等参数) - 延迟数据要区分「服务端处理时间」(从 handler 开始到 WriteHeader 结束)和「客户端观测延迟」——后者包含网络 RTT、排队、DNS 解析,两者差值大说明网络或客户端配置有问题
- QPS 稳定性比峰值更重要:观察
vegeta输出的latencies.mean随时间波动曲线,若后半段延迟陡增,大概率是资源耗尽(内存 OOM、文件描述符打满、DB 连接池枯竭) - 别把单次压测结果当绝对值——至少跑 3 轮取中位数,每次间隔 2 分钟让系统恢复
真正难的不是生成图表,而是把 pprof 里一个 runtime.mapaccess1 占 40% CPU 的现象,对应到代码里某个未加锁的 map 并发读写;这种关联需要你既懂 Go 运行时机制,也熟悉自己业务逻辑的执行路径。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










