eBPF を使用した騒がしい隣人検出 ノート

eBPF を使用した騒がしい隣人検出

Netflixは、eBPFを使用して、サーバーのリソースを大量に使用するコンテナ(ノイジー・ネイバー)が隣接するコンテナのパフォーマンスを低下させることを示すラン・キューラテンシーの継続的な監視を行っています。eBPFのフック(sched_wakeup、sched_wakeup_new、sched_switch)は、ラン・キューラテンシーをキャプチャし、cgroup IDと関連付けるためにkfuncs(カーネル・ファンクション)を使用してRCU保護されたデータにアクセスします。eBPFのレート・リミッターは、観察可能性とパフォーマンスのバランスをとり、ユーザースペースに送られるデータ・ポイントの数を制限します。ユーザースペースのプロセスは、eBPFのリング・バッファーからイベントを受け取り、アトラスにメトリクスを出力します。このメトリクスには、cgroup ID別のラン・キューラテンシー(runq.latency)とプリエンプション・カウント(sched.switch.out)が含まれます。runq.latencyとsched.switch.outの両メトリクスがノイジー・ネイバーの特定に必要です。なぜなら、runq.latencyだけでは、コンテナがCPUの制限に達している場合、誤解を招く可能性があるからです。ケース・スタディーでは、新しいコンテナがホストのCPUを完全に使用し、ラン・キューラテンシーとプリエンプションのスパイクを引き起こすノイジー・ネイバーの問題を示しています。sched.switch.outメトリクスを使用して、ノイジー・ネイバーがシステム・プロセスであることが特定されました。eBPFコードの最適化、特にBPF_MAP_TYPE_HASHの使用、タスク・ストラクト・メンバーの直接アクセス、カーネル・タスクの無視などで、オーバーヘッドが最小限度に抑えられます。Linuxカーネル・パッチが提出され、受け入れられて、カーネルでの統計の計算を改善しました。BPFtop、オープンソースのeBPFプロセス監視ツールが、eBPFコードのオーバーヘッドを測定するために使用されました。