贝利信息

Golang并发编程如何做压力测试_Go语言性能测试方法

日期:2026-01-13 00:00 / 作者:P粉602998670
Go并发压力测试核心是控制goroutine生命周期、资源竞争与真实负载模型;盲目增并发会掩盖瓶颈、扭曲pprof数据;-bench适合无状态逻辑,需加-benchmem看内存分配,禁用time.Sleep,I/O场景应换专用压测工具。

Go 并发程序的压力测试,核心不是“起多少 goroutine”,而是控制好 goroutine 生命周期、资源竞争点和真实负载模型。盲目增加并发数只会掩盖瓶颈,甚至让 pprof 数据失真。

go test -bench 测纯函数并发吞吐,但别信默认结果

基准测试适合验证无状态逻辑(比如加解密、编解码),但默认 Benchmark 不模拟真实请求节奏,容易高估吞吐:

func BenchmarkConcurrentParseJSO

N(b *testing.B) { b.ReportAllocs() b.RunParallel(func(pb *testing.PB) { for pb.Next() { _ = json.Unmarshal([]byte(`{"id":1}`), &struct{ ID int }{}) } }) }

HTTP 服务压测:用 heyvegeta,别手写 goroutine 循环

自己用 for i := 0; i 发请求,既难控 QPS,又无法统计成功率、P95 延迟、连接复用效果。推荐:

查并发瓶颈:pprof 要抓对时间点,且必须看 goroutinemutex profile

服务在压测中变慢,光看 cpu profile 可能找不到根因:

真实场景必须模拟业务约束:超时、重试、限流、连接池

压测结果脱离这些,等于没测:

最常被忽略的一点:压测环境的 GOMAXPROCS 和生产是否一致?容器中未显式设置时,Go 1.21+ 会按 cgroup CPU quota 自动调整,但旧版本或非容器环境可能仍为全核数,导致线程调度行为差异极大。