利用eBPF提升基础设施可观测性

Netflix 使用 eBPF 检测多租户系统中的“噪声邻居”问题

Netflix 的 Compute 和 Performance Engineering 团队通过实验性地使用 eBPF(扩展的伯克利数据包过滤器)来监控 Linux 内核,以获取关于进程调度和“噪声邻居”问题的深入见解。eBPF 的引入旨在解决传统分析工具(如 perf)带来的性能开销问题,并实现持续的内核调度器监控,而无需等到问题发生后再进行干预。

关键挑战与解决方案

  1. 传统工具的局限性perf 等工具通常在高性能场景下引入较大的开销,且通常只在问题发生后部署,同时需要较高的工程师专业知识。
  2. eBPF 的优势:eBPF 允许在不显著影响系统性能的情况下,持续监控 Linux 调度器,从而实时检测性能问题。

核心指标:进程延迟

Netflix 工程师将进程延迟(run queue latency)作为检测“噪声邻居”问题的关键指标。进程延迟指的是进程在调度队列中等待 CPU 分配的时间。通过监控这一指标,可以识别出可能导致性能问题的“噪声邻居”。

eBPF 实现细节

Netflix 使用了三个 eBPF 钩子来监控进程延迟:

  • sched_wakeupsched_wakeup_new:当进程从“睡眠”状态变为“可运行”状态时触发。
  • sched_switch:当 CPU 切换到另一个进程时触发。

通过这些钩子,Netflix 能够计算进程延迟,即进程从“可运行”状态到被分配到 CPU 的时间差。

数据处理与传输

收集到的内核事件通过 Go 程序处理,并将指标发送到 Netflix 的指标后端 Atlas。为了高效地将数据传输到用户空间的 Go 程序,Netflix 使用了 eBPF 环形缓冲区(ring buffer),这种机制避免了额外的内存复制和系统调用,提高了性能。

额外信息收集

除了时间信息,eBPF 还可以收集与进程相关的其他信息,例如进程的 cgroup ID。这对于正确解释进程的抢占行为至关重要,因为“噪声邻居”问题不仅涉及延迟,还涉及进程被抢占的频率和抢占进程的来源。

性能优化

为了确保 eBPF 监控不会对系统性能产生负面影响,Netflix 开发了 bpftop 工具,用于测量 eBPF 代码的开销。通过该工具,他们能够进一步优化 eBPF 代码,将每个 sched_* 钩子的开销控制在 600 纳秒以内,从而确保监控可以持续运行而不会影响系统性能。

总结

Netflix 通过 eBPF 实现了对 Linux 调度器的持续监控,有效检测了多租户系统中的“噪声邻居”问题。他们的方法不仅降低了监控开销,还通过优化确保了监控工具的实时性和高效性。这一方案为类似场景下的性能监控提供了有价值的参考。

阅读 52
0 条评论