2025/08/24 10:00 OOMProf: Profiling on the Brink

やあ、ロボ子。今日はOOMキル、つまりメモリ不足でプログラムが強制終了される問題について話すのじゃ。

OOMキル、よく聞きますね。でも、原因特定が難しいことが多いです。

そうなんじゃ!記事によると、OOMキルを引き起こしたプロセスと、実際にキルされるプロセスが違う場合もあるらしいぞ。まるで犯人と被害者が違うミステリーじゃな。

それは困りますね。メモリプロファイリングも最新でない場合があるとのこと。特にGC言語では、ゴミが回収されるタイミングによって情報が古くなることがあるんですね。

そうそう。しかも、Linuxのデフォルト設定だと、メモリ割り当てが失敗しないから、OOMキルが発生するまで問題に気づかないことが多いんじゃ。

まるで時限爆弾ですね。そこで、eBPFを活用したOOM監視システム「OOMProf」が登場するわけですね。

その通り!OOMProfは、GoプログラムがOOMキルされる際に、メモリ割り当てをキャプチャして、開発者が問題を特定しやすくする優れものなのじゃ。

`signal_deliver`トレースポイントを監視して、OOMキルされたプログラムのメモリを分析するんですね。

`oom/mark_victim`トレースポイントで、OOMキルの対象になったPIDを特定するのも重要じゃ。

OOMProfライブラリの`ProfilePid`関数を使えば、OOMのコンテキスト外でもGoプログラムをプロファイリングできるんですね。便利そうです。

OOMProfの仕組みはこうじゃ。まず、`signal_deliver`トレースポイントで、OOMキル対象のプログラムがkillシグナルを受信したことを検知する。

次に、`oom/mark_victim`トレースポイントでPIDをマップに記録し、`signal/signal_deliver`トレースポイントで、シグナルを受信したPIDがマップにあるか確認するんですね。

そう!そして、eBPFプログラムが、OOMキルされたプロセスのメモリを読み取り、メモリプロファイルを生成するのじゃ!

なるほど。でも、制限事項もあるんですね。Goプログラムのメモリプロファイルは、sweepごとに記録されるため、最新でない可能性があるとか。

そうなんじゃ。eBPFプログラムは、ユーザー空間メモリにアクセスできるプロセスが限られるし、ストリップされたGoプログラムはプロファイリングできない。それに、Goのメモリプロファイリングはデフォルトで有効になっていないからの。

いろいろと注意が必要ですね。OOMProfはライブラリとして提供され、Parca Agentに統合されているんですね。`--enable-oom-prof`フラグでOOMメモリプロファイルを自動的にアップロードできるのは便利そうです。

今後の計画としては、Rust/ネイティブプログラムのjemalloc、tcmalloc、mimallocプロファイリングのサポートや、スタック/goroutineダンプのサポートがあるみたいじゃ。

ますます便利になりそうですね。OOMキル対策、奥が深いですね。

ところでロボ子、OOMキルって、まるで冷蔵庫の中身が空っぽになるみたいじゃない?

え?どういうことですか?

だって、メモリが足りなくなると、プログラムが「もう何も食べられない!」って悲鳴を上げるんだもん。そして、強制終了…まるで冷蔵庫が空っぽで、何も作れない状態じゃ。

…博士、それはちょっと強引な例えですね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
