使用Go语言进行负载测试需模拟高并发并收集延迟数据,核心指标包括平均延迟、P95/P99延迟、吞吐量和错误率。

在 Golang 中进行负载测试和分析并发请求的响应延迟,关键在于模拟高并发场景并准确收集性能数据。Go 语言本身具备优秀的并发支持,结合标准库和第三方工具,可以高效完成这类任务。
使用内置工具快速发起并发请求
利用 net/http 和 sync.WaitGroup 可以轻松构建并发请求测试代码。通过 goroutine 模拟多个客户端同时访问目标接口,记录每个请求的耗时。
示例代码:package mainimport ( "fmt" "net/http" "sync" "time" )
func main() { url := "https://www.php.cn/link/1441b775217b1c146325d7dfb664c09d" concurrency := 10 totalRequests := 100
var wg sync.WaitGroup latencies := make([]time.Duration, 0) var mu sync.Mutex client := &http.Client{Timeout: 10 * time.Second} start := time.Now() for i := 0; i < totalRequests; i++ { wg.Add(1) go func() { defer wg.Done() reqStart := time.Now() resp, err := client.Get(url) reqEnd := time.Since(reqStart) mu.Lock() latencies = append(latencies, reqEnd) mu.Unlock() if err != nil { fmt.Printf("请求失败: %v\n", err) return } resp.Body.Close() }() // 控制并发数 if (i+1)%concurrency == 0 { wg.Wait() } } duration := time.Since(start) fmt.Printf("总耗时: %v\n", duration) fmt.Printf("平均延迟: %v\n", avg(latencies))}
这段代码展示了如何控制并发量、收集每次请求的响应时间,并计算整体性能指标。
分析响应延迟的关键指标
负载测试不只是看是否能发出请求,更重要的是理解服务在压力下的表现。以下几项是必须关注的:
立即学习“go语言免费学习笔记(深入)”;
- 平均延迟:所有请求耗时的算术平均值,反映整体响应速度
- 95/99 百分位延迟:识别慢请求,比如 P99 表示 99% 的请求都比它快
- 吞吐量(QPS):单位时间内成功处理的请求数量
- 错误率:超时、连接拒绝等异常请求占比
func percentile(values []time.Duration, p float64) time.Duration {
sort.Slice(values, func(i, j int) bool {
return values[i] < values[j]
})
idx := int(float64(len(values))*p/100.0) - 1
if idx < 0 { idx = 0 }
return values[idx]
}
// 调用 percentile(latencies, 95)
使用专业工具简化测试流程
虽然手动编写测试代码灵活度高,但日常开发中可借助成熟工具提升效率。例如:
- hey:Go 编写的 HTTP 负载生成器,类似 ab,但支持 JSON 和 HTTPS
- vegeta:更强大的命令行 HTTP 负载测试工具,支持持续压测和结果导出
hey -n 1000 -c 50 https://www.php.cn/link/1441b775217b1c146325d7dfb664c09d
该命令发送 1000 个请求,最大并发 50,自动输出统计信息包括延迟分布和 QPS。
基本上就这些。自己写代码适合定制化分析,工具则更适合快速验证。关键是明确测试目标,选择合适的方法收集真实有效的性能数据。










