萌えハッカーニュースリーダー

2025/05/07 20:42 Hunting down a C memory leak in a Go program (2021)

出典: https://medium.com/zendesk-engineering/hunting-down-a-c-memory-leak-in-a-go-program-2d08b24b617d
hakase
博士

やあ、ロボ子!今日のITニュースはZendeskのKafkaコンシューマーにおけるメモリリークの話じゃ。

roboko
ロボ子

Kafkaコンシューマーのメモリリークですか、博士。それは大変ですね。

hakase
博士

そうなんじゃ。ZendeskではGoとKafkaの利用が増えておるらしい。そこで`confluent-kafka-go`ライブラリを使ったKafkaコンシューマーアプリでCメモリリークが発生したとのことじゃ。

roboko
ロボ子

`confluent-kafka-go`は`librdkafka` Cライブラリを基盤にしているのですね。

hakase
博士

その通り!問題は、アプリ(`frontend-event-ingestor`)のメモリ使用量が時間とともに直線的に増加し、最終的にLinuxのOOM Killerに強制終了される事態になったことじゃ。

roboko
ロボ子

OOM Killerですか。それは深刻ですね。Goのメモリ統計では異常が見られなかったとのことですが、Cの領域でリークしていたのですね。

hakase
博士

`jemalloc`を導入して`jemalloc_active`メトリクスを監視したところ、jemallocによるメモリ割り当てが増加していることが確認できたらしいぞ。

roboko
ロボ子

Valgrindでは完全には検出できなかったのですね。

hakase
博士

そこで、ユーザー空間eBPFトレーシング(bpftrace)の出番じゃ!`rd_malloc`と`rd_free`のトレースポイントを`librdkafka`に挿入して、割り当てられたが解放されていないメモリのアドレスとコールスタックを追跡したんじゃ。

roboko
ロボ子

bpftraceですか!すごいですね。メモリリークの原因は、Kafkaブローカーからの`OffsetCommitResponse`イベントがキューに蓄積され、アプリケーションで処理されないことだったのですね。

hakase
博士

そう!たった3行のコード変更で、アプリが`OffsetCommitResponse`イベントを消費し、破棄するように修正したところ、メモリ使用量が安定し、リークが解消されたんじゃ。

roboko
ロボ子

素晴らしい!教訓として、`librdkafka`の内部構造に関する知識が深まったこと、bpftraceなどのツールがメモリリーク以外の問題解決にも役立つこと、そして無制限のキューサイズは危険であることが挙げられていますね。

hakase
博士

その通りじゃ!今回の件で、私は改めてBPFの力を思い知ったぞ。ところでロボ子、BPFって何の略か知ってるか?

roboko
ロボ子

確か、Berkeley Packet Filter、だったと思います。

hakase
博士

正解!でも、私が思うに、真のBPFとは…Beautiful Princess Finderの略だと思うのじゃ!

roboko
ロボ子

博士、それはちょっと違うと思います…

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search