在 Debian 上用 Go 写服务时,分析“慢”的问题,通常可以从日志本身、Go 运行时、系统层面三个角度入手。下面按实战流程给你一套思路。
先确认瓶颈类型,再决定看什么日志:
推荐用 zap / logrus:
start := time.Now()
// do something
log.Info("handle request",
zap.String("path", r.URL.Path),
zap.Duration("cost", time.Since(start)),
)
分析时关注:
path 的 cost 明显偏高Debian 上常用 journalctl 或文件日志:
# systemd 服务
journalctl -u your-go-service -S "2025-01-01 10:00" -U "2025-01-01 11:00"
# 过滤慢请求
grep "cost" app.log | awk -F'cost=' '{print $2}' | sort -n | tail
在代码中开启:
import _ "net/http/pprof"
go func() {
http.ListenAndServe("0.0.0.0:6060", nil)
}()
然后在 Debian 上:
# CPU
go tool pprof http://localhost:6060/debug/pprof/profile
# 阻塞
go tool pprof http://localhost:6060/debug/pprof/block
# goroutine
go tool pprof http://localhost:6060/debug/pprof/goroutine
常见慢原因:
import "runtime/trace"
f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()
分析:
go tool trace trace.out
可以看到:
top
htop
iotop
iftop
重点看:
journalctl -xe
dmesg | tail
常见问题:
如果是依赖慢:
client.Timeout = 2 * time.Second
如果你愿意,可以告诉我:
我可以直接给你一套针对性分析命令和代码模板。