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工具的宝贵经验,显著提升了调试能力。