在高并发系统中,Go 语言凭借轻量级的 goroutine 和出色的调度器,成为后端开发的热门选择。本文分享我们在实际项目中的性能优化经验。
连接池管理
问题
每个请求创建新的数据库连接会导致连接数暴增,拖垮数据库。
优化
使用 sync.Pool 配合连接池:
var dbPool = &sync.Pool{
New: func() interface{} {
db, _ := sql.Open("mysql", dsn)
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(20)
return db
},
}
内存优化
减少 GC 压力
- 使用
sync.Pool复用对象 - 预分配 slice 容量
- 避免在热路径上创建短生命周期对象
字符串拼接
在高频路径中使用 strings.Builder 替代 fmt.Sprintf:
var b strings.Builder
b.Grow(128) // 预分配
b.WriteString("prefix-")
b.WriteString(id)
result := b.String()
协程调度优化
控制 goroutine 数量
使用 worker pool 模式替代无限制的 goroutine 创建:
sem := make(chan struct{}, runtime.NumCPU() * 2)
for _, task := range tasks {
sem <- struct{}{}
go func(t Task) {
defer func() { <-sem }()
process(t)
}(task)
}
成果
在某电商项目的订单服务中,经过以上优化:
- P99 延迟从 450ms 降至 80ms
- 内存使用降低 40%
- GC 暂停时间减少 60%
性能优化是一个持续过程,需要在实际负载下不断测量和调整。