Netflixはパフォーマンスの改善のためにどのようにLinuxのカーネルを拡張する仕組み「eBPF」を利用しているのか?
Netflixの技術ブログに、Linuxのカーネル機能を拡張できる「eBPF」を活用してパフォーマンスを改善する方法が投稿されました。
Noisy Neighbor Detection with eBPF | by Netflix Technology Blog | Sep, 2024 | Netflix TechBlog
https://netflixtechblog.com/noisy-neighbor-detection-with-ebpf-64b1f4b3bbdd
Netflixのサービスを支えるプラットフォームのTitusは1つのシステムに複数のサービスを同居させるマルチテナント方式のプラットフォームです。マルチテナント環境では1つのサービスがサーバーのリソースを大量に消費することで隣接するコンテナのパフォーマンスを低下させる「ノイジーネイバー」が特に問題になります。
しかし、従来のパフォーマンス分析ツールのperfなどは大きなオーバーヘッドが発生してさらにパフォーマンスが低下するリスクがあったり、問題の発生後にパフォーマンス分析ツールを入れても調査の効率が悪かったりするなど、ノイジーネイバーの影響を検出したり問題をデバッグしたりするのは難しいとのこと。
そこで、NetflixのエンジニアチームはLinuxのカーネル機能を拡張するツールであるeBPFを使用し、「sched_wakeup」「sched_wakeup_new」「sched_switch」という3つのフックを活用してプロセスがCPUで実行されるまでにスケジューリングキューでどの程度待機しているのかを測定しました。
スケジューリングキューでの待機時間を継続的に監視することで、ノイジーネイバーの問題が発生した時にスムーズに捕捉できるようになるとのこと。例えば下図は単一のコンテナを実行する十分なCPU容量を備えたサーバーのスケジューリングキューの待機時間の推移です。青線で示されているコンテナの待機時間は平均83.4マイクロ秒で、まれに400マイクロ秒程度のスパイクが発生していることが分かります。
途中でホスト上のCPUをフル活用する2つ目のコンテナを起動すると、1つ目のコンテナの待機時間に13万1000マイクロ秒(131ミリ秒)のスパイクが発生しました。緑色の線で表示されているシステムのプリエンプションも同時に増加しており、実際のノイジーネイバーはシステムプロセスであることが浮き彫りになっています。アプリケーションがHTTPトラフィックを処理している場合などにこうしたパターンが現れるとのこと。
Netflixは、eBPFを使用することでシステムのパフォーマンスを継続的かつ効率良く監視することができ、データを元に実用的な洞察が可能になったと述べています。