一个泄漏的协程的案例

主要观点:在 Go 语言中,得益于 Goroutines 和通道的概念,使用高级并发模式构建东西很容易,但并发也很难正确实现,Go 语言虽设计有并发理念但仍存在内存泄漏问题。文中通过实例展示了如何使用 Pyroscope 和 pprof 进行性能分析以找出内存泄漏的 Goroutine,以及一个导致 Goroutine 泄漏的代码示例,还提到了用 goleak 包在测试中检测内存泄漏的方法和 Uber 的 LeakProf 系统。
关键信息:

  • Go 中 Goroutine 本质是协程,映射到绿色线程再到操作系统的原生线程。
  • 简单的go func()语法可轻松创建并行执行小任务的 Goroutine。
  • 文中代码中ToDoneInterface函数导致 Goroutine 泄漏,defer close()在错误的通道上关闭。
  • 可使用 Pyroscope 和 pprof 分析内存泄漏,goleak包可用于测试中的内存泄漏检测,Uber 的 LeakProf 系统可定期检测生产环境中的泄漏。
    重要细节:
  • Grafana 的 dashboard 可监控 Goroutine 内存使用情况,Pyroscope 可基于pprof转储生成交互内存火焰图。
  • 可通过go tool pprof [profile_file]分析pprof文件,安装graphviz可生成可视化快照。
  • goleak.VerifyNone(t)可用于在测试中检测内存泄漏。
  • LeakProf 是一个单独部署的系统,可定期拉取pprof转储并监测内存使用情况。
阅读 22
0 条评论