在 Debian 上用 Go 写程序,发现日志写入很慢,通常不是 Go 本身慢,而是系统/配置/使用方式导致的。下面按“最常见 → 较少见”的原因给你梳理,并给出对应解决办法。
os.Open/defer Close错误示例:
func log(s string) {
f, _ := os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
f.WriteString(s)
f.Close()
}
每次都打开/关闭文件,极慢。
✅ 正确做法:
var logFile *os.File
func init() {
logFile, _ = os.OpenFile("/var/log/app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
}
func log(s string) {
logFile.WriteString(s)
}
log.Println 但没设 buffer标准库 log 是同步写磁盘的。
✅ 解决:
w := bufio.NewWriter(logFile)
log.SetOutput(w)
或
zaplogruszerolog在:
日志写盘会被拖慢。
✅ 排查:
iostat -x 1
dmesg | tail
✅ 解决:
如果你:
会写两遍。
✅ 建议:
ext4 默认:
data=ordered✅ 可选(有风险):
mount -o remount,data=writeback /
⚠ 不建议生产随意改
fmt.Sprintf 在热路径log(fmt.Sprintf("user %d login %s", u, t))
字符串拼接很慢。
✅ 用结构化日志:
logger.Info("user login", zap.Int("uid", u))
老 Go(1.10 以前)调度和 IO 较差。
✅ 建议:
go version
至少用 Go 1.20+
你可以按顺序查:
zap + 文件 + 异步 + 按天切割
如果你愿意,可以:
我可以直接帮你定位是哪一条。