定位思路与快速排查
curl http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.pprof,再用 go tool pprof cpu.pprof 查看 top、web 生成调用图。非 HTTP 场景可用 runtime/pprof 直接写 profile 文件分析。常见瓶颈与对策
| 瓶颈维度 | 典型症状 | 快速验证 | 优化要点 |
|---|---|---|---|
| CPU | top 中 go 进程占用高、pprof 热点函数集中 | pprof 的 top/web 显示少数函数占比高 | 优化算法/正则;对固定结构用 easyjson;升级 Go 版本获取改进 |
| 内存与 GC | RSS 持续攀升、GC 停顿明显、pprof 中 mallocgc/sweepspan 占比高 | pprof 的 heap/alloc_objects;GODEBUG=gctrace=1 观察 STW |
降低分配:用 sync.Pool、复用 buffer、strings.Builder;调整 GOGC(如 20–200)或用 ballast 减少 GC 触发频率 |
| Goroutine 调度与锁竞争 | GOMAXPROCS 设置不当、大量 goroutine 切换、锁争用高 | pprof 的 goroutine、block 采样;runtime.NumGoroutine() 观察 |
控制并发度(Worker Pool);减小锁粒度、用 atomic/无锁结构;必要时设置 GOMAXPROCS |
| 网络 | 高并发连接下 accept/recv 延迟、连接超时、端口耗尽 | ss -s、`netstat -n |
awk ‘{print $4}’ |
| 文件 I/O | 磁盘吞吐/时延高、请求排队 | iostat -x 1、vmstat 1 |
使用 SSD、增大 I/O 并发/队列深度、合并写、减少系统调用 |
| 系统资源限制 | 报错 too many open files、连接建立失败 | ulimit -n、服务日志 |
提升 nofile(如 65536);检查 systemd LimitNOFILE;必要时调大内核队列 |
| 日志与监控 | 日志过多导致 write 阻塞、采集开销大 | 观察日志速率与磁盘写时延 | 降低日志级别、异步/批量写、采样;监控用 Prometheus/Grafana 控制开销 |
| 以上对策涉及的系统与运行时参数、工具与方法为 CentOS 上常见且有效的实践路径。 |
系统层面检查清单
ulimit -n 与服务内 runtime.NumGoroutine() 交叉验证。net.core.somaxconn=65535、net.ipv4.tcp_max_syn_backlog=65535、net.ipv4.ip_local_port_range=1024 65535、net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_fin_timeout=30,执行 sysctl -p 生效。iostat -x 1、vmstat 1、sar -n TCP 观察瓶颈是否在 I/O 或网络栈。运行时与编译优化要点