Hasty Briefsbeta

双语

Hunting down a C memory leak in a Go program (2021)

a year ago
  • #memory-leak
  • #Go
  • #eBPF
  • Zendesk在使用confluent-kafka-go库的Go程序中遇到内存泄漏问题,该库基于C语言库librdkafka构建。
  • 初步调查通过分析内存指标确认泄漏发生在程序的C语言部分,而非Go代码。
  • 使用jemalloc等工具确认泄漏源于实际内存分配,而非内存碎片或内核问题。
  • 尝试使用Valgrind但未能识别泄漏,因为内存在程序终止前被释放,掩盖了问题。
  • 采用eBPF和bpftrace工具在运行时动态追踪内存分配并识别泄漏点。
  • 通过对librdkafka进行定制修改(包括添加USDT探针),实现了bpftrace的有效追踪。
  • 最终定位到泄漏源于librdkafka中未处理的OffsetCommitResponse事件,导致队列无限增长。
  • 通过简单修复——消费并丢弃这些事件,解决了内存泄漏问题。
  • 该过程为团队提供了关于librdkafka和eBPF工具的宝贵经验,显著提升了调试能力。