在CentOS上进行性能分析前,需先优化Golang日志的结构化和性能,确保日志可高效收集和分析。
zap(Uber开源,高性能、结构化)或zerolog(零分配、低延迟),替代标准库log包。例如,zap的初始化代码:package main
import (
"go.uber.org/zap"
)
func main() {
logger, _ := zap.NewProduction() // 生产环境配置(JSON格式、压缩)
defer logger.Sync() // 确保日志刷新到磁盘
logger.Info("Application started", zap.String("version", "1.0.0"))
}
WARN或ERROR,避免DEBUG/INFO日志过多影响性能;开发环境可设为DEBUG。zap的JSON编码配置:config := zap.NewProductionConfig()
config.Encoding = "json" // 输出JSON格式
logger, _ := config.Build()
zap的异步Logger或zerolog的Hook实现异步记录,减少业务线程阻塞;批量写入(如BufferedWriter)降低磁盘I/O次数。/var/log/myapp.log),可使用tail、grep等命令实时查看,或通过logrotate工具切割日志(避免文件过大):# 创建logrotate配置(/etc/logrotate.d/myapp)
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
# 手动触发切割
sudo logrotate -f /etc/logrotate.d/myapp
journalctl收集CentOS系统日志(如内核、服务日志),并与应用日志关联分析:# 查看系统日志(最近1小时)
journalctl --since "1 hour ago"
# 关联应用日志(假设应用名为myapp)
journalctl -u myapp.service --since "1 hour ago"
pprof是Golang官方性能分析工具,可分析CPU、内存、goroutine等指标,结合日志定位性能瓶颈。
net/http/pprof,启动HTTP服务器暴露性能接口:package main
import (
_ "net/http/pprof"
"net/http"
)
func main() {
go func() {
http.ListenAndServe("localhost:6060", nil) // 默认端口6060
}()
// 业务代码...
}
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30go tool pprof http://localhost:6060/debug/pprof/heapgo tool pprof http://localhost:6060/debug/pprof/blockgo-torch工具将pprof数据转换为可视化火焰图(需安装Graphviz):go get -u github.com/uber/go-torch
go-torch -d 30 -f ./torch.svg http://localhost:6060/debug/pprof/profile
火焰图可直观展示热点函数(如CPU占用高的代码段)。Filebeat收集应用日志(/var/log/myapp.log),发送到Logstash进行解析(如提取时间戳、日志级别),再存储到Elasticsearch。Kibana创建 dashboard,可视化日志指标(如错误率、请求耗时),快速定位异常。Loki是轻量级日志聚合系统,适合与Prometheus集成。使用Promtail收集日志(配置targets.yaml指向日志文件),存储到Loki。Grafana创建 dashboard,使用LogQL查询日志(如{job="myapp"} |= "ERROR"),并结合Prometheus的指标(如CPU使用率)进行关联分析。pprof的内存分析,可能发现数据库连接池耗尽;pprof显示CPU占用高,结合日志中的“慢查询”记录,可能发现SQL语句未优化。sync机制缓解)。