Golang Go语言关于打包到Windows下运行,在控制台打日志导致卡顿的问题

发布于 1周前 作者 sinazl 来自 Go语言

配置没有什么,就是简单的控制台和文件双写

zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout),zapcore.AddSync(&hook))

hook 是 lumberjack

只要请求量一大,就开始卡顿,Goroutine 快速增加,而且看起来都是卡在 writeConsole

对比测试,只输出 os.Stdout 和 写入文件,也是控制台有问题,流量一大就开始卡顿

现在在生产环境关掉 os.Stdout 的写入已经解决了问题,不过我好奇为什么会这么卡,之前在 linux 下开 docker 不也是输入到 os.Stdout,并没有这个问题


Golang Go语言关于打包到Windows下运行,在控制台打日志导致卡顿的问题

更多关于Golang Go语言关于打包到Windows下运行,在控制台打日志导致卡顿的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

给 stdout 套一层 bufio

更多关于Golang Go语言关于打包到Windows下运行,在控制台打日志导致卡顿的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Windows cmd 的打印输出性能贼差,之前写过一个下载小工具,在控制台中打印更新下载进度条,可以理解为疯狂在控制台里 print 。
同样的程序在 Windows cmd 下和 git bash 下运行,运行时长差了几十倍。

别说 bufio 了,我连 channel + bufio 都加上了还是搞不定,日志吞吐量上来了,压测模拟器的 CPU 都跑炸了

可能是老的 conhost 的问题,为了兼容旧的行为,每行输出时都会加锁来做同步。
你可以试试在 Windows Terminal 下运行,这个有全新的 conhost 实现,性能应该会有显著提升。

针对Golang程序打包到Windows下运行,在控制台打日志导致卡顿的问题,以下是一些专业的分析和建议:

  1. 日志IO操作的影响:将日志写入硬盘或其他输出源需要进行IO操作,这是一种相对较慢的操作,尤其在高并发情况下,频繁的IO操作可能成为性能瓶颈。
  2. 同步写入导致的阻塞:默认情况下,Go的日志库在写入日志时会进行同步操作,这意味着每次写入日志时,程序会暂停执行直到日志被完全写入磁盘,从而导致程序卡顿。

针对上述问题,以下是一些优化建议:

  1. 使用异步日志:异步日志机制可以避免阻塞主程序的执行。通过将日志消息放入缓冲区,然后立即返回,由另一个线程负责将缓冲区中的日志写入磁盘,可以提高程序的响应能力和整体性能。
  2. 优化日志级别和输出:根据实际需求选择适当的日志级别,可以减少日志输出量,从而降低对系统资源的消耗。同时,可以将不同级别的日志输出到不同的文件,以降低整体日志输出的开销。

综上所述,通过优化日志处理方式,可以有效解决Golang程序在Windows下运行时的卡顿问题。

回到顶部