温馨提示×

debian golang日志怎么分析慢

小樊
50
2026-10-15 21:36:18
栏目: 编程语言

在 Debian 上用 Go 写服务时,分析“慢”的问题,通常可以从日志本身、Go 运行时、系统层面三个角度入手。下面按实战流程给你一套思路。


一、先明确“慢”是什么慢

先确认瓶颈类型,再决定看什么日志:

  • 请求慢(HTTP/RPC 响应时间长)
  • 启动慢
  • 定时任务慢
  • CPU 高导致整体慢
  • IO / 网络慢

二、Go 日志层面分析(最常用)

1. 结构化日志 + 耗时字段

推荐用 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 明显偏高
  • 是否集中在某些时间段

2. 日志按级别和耗时过滤

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

三、Go 性能分析(非常关键)

1. pprof(强烈推荐)

在代码中开启:

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

常见慢原因:

  • 锁竞争(block)
  • GC 频繁
  • goroutine 泄漏

2. trace(看时间线)

import "runtime/trace"

f, _ := os.Create("trace.out")
trace.Start(f)
defer trace.Stop()

分析:

go tool trace trace.out

可以看到:

  • 网络等待
  • 系统调用
  • GC 停顿

四、Debian 系统层面辅助分析

1. 看系统资源

top
htop
iotop
iftop

重点看:

  • CPU 是否跑满
  • 磁盘 IO 是否瓶颈
  • 网络是否丢包

2. 系统日志

journalctl -xe
dmesg | tail

常见问题:

  • OOM
  • 磁盘满
  • 网络中断

五、数据库 / 外部依赖慢

如果是依赖慢:

  • 加 SQL 慢查询日志
  • 加 HTTP 客户端超时
  • 打印外部调用耗时
client.Timeout = 2 * time.Second

六、常见 Go 慢的根因总结

  • 未设置 context 超时
  • 锁使用不当
  • 大量 GC(对象分配过多)
  • 同步调用外部服务
  • 日志写磁盘太频繁
  • goroutine 泄漏

如果你愿意,可以告诉我:

  • 你是 HTTP 服务 / 后台任务 / CLI
  • 日志是 文件 / systemd / docker
  • 慢的现象是 整体慢还是某些请求慢

我可以直接给你一套针对性分析命令和代码模板。

0 踩