【Falco】丢事件与缓冲:drop 归因与 BPF iterators 门

💡 原文中文,约7800字,阅读约需19分钟。
📝

内容提要

本文总结Falco 0.44.1中事件丢失问题,聚焦缓冲配置、drop指标语义及BPF迭代器恢复机制。强调区分缓冲不足与规则未命中,modern_ebpf可调CPU缓冲共享,迭代器加速状态愈合但容器非主机PID时自动禁用。调参需先确认引擎类型,避免误判,并分列双引擎证据包。

🔎

延伸解读

调参前先确认引擎

文章强调,调参前必须先确认当前使用的引擎类型。modern_ebpf 有 cpus_for_each_buffer 等专属旋钮,而 kmod 没有对等项。如果误在 kmod 上调整 modern 的参数,可能无效甚至造成误解。建议先查看 Driver 行,再决定调整方向。

drop 与规则未命中是两回事

drop 表示事件在进入规则引擎前就丢失,而规则未命中是事件到达后条件为假。两者可能同时发生,但证据包不同。不能把 drop 当作“无威胁”或“规则未命中”的信号,否则可能掩盖真实问题。需要区分环满被迫丢与 drop_failed_exit 的有意丢弃。

iterators 与缓冲大小是互补的

增大缓冲可以降低环满概率,但 iterators 改善的是丢事件后的状态愈合。只调大缓冲而不启用 iterators,可能在尖峰后留下字段空洞;反之,如果环持续满,愈合会跟不上。0.44 同时推进两条线,但排障时必须分开验证。

容器环境下 iterators 可能自动禁用

即使配置 disable_iterators: false,只要 Falco 不在 host PID 命名空间,iterators 也会自动禁用,回退到 procfs。这是可见性约束,不是配置未生效。此时应理解机制回退,不要误判为配置问题。

Q&A

Falco 中 buf_size_preset 参数的作用是什么?如何选择合适的值?

buf_size_preset 是 Falco 中用于配置 syscall 缓冲大小的索引,不是直接指定字节数。索引 1 到 10 对应从 1MB 到 512MB 的 2 的幂次大小(例如索引 4 对应约 8MB)。增大该值可以降低高负载下的丢事件概率,但会增加内存映射成本(缓冲在虚拟地址空间中映射两次)。选择时需确保大小是 2 的幂、是系统页大小的倍数,且大于 2 倍页大小。建议根据实际负载和内存限制调整,并先确认引擎类型(modern_ebpf 或 kmod)。

Falco 中 cpus_for_each_buffer 参数是做什么的?在什么引擎下可用?

cpus_for_each_buffer 是 modern_ebpf 引擎特有的参数,用于控制多个 CPU 共享一个 BPF ring buffer 的方式。默认值为 2,表示每对 CPU 共享一个缓冲;设为 1 表示每个 CPU 一个缓冲;设为 0 或等于在线 CPU 数表示所有 CPU 共享一个缓冲。该参数有助于在 Kubernetes 内存限额下避免 OOM,并减少内存占用,但过少会增加内核侧争用。kmod 引擎没有对应的参数。

Falco 中 drop_failed_exit 参数的作用是什么?它与环满导致的丢事件有何不同?

drop_failed_exit 参数用于在驱动中丢弃失败的 syscall exit 事件,以减少进入环形缓冲的流量,可能降低丢事件概率,但会牺牲可见性。这是有意丢弃,与环满被迫丢不同。如果规则依赖失败路径的语义,需要单独评估影响。

Falco 中 syscall_event_drops 指标的含义是什么?如何利用它进行告警?

syscall_event_drops 是 Falco 中用于检测环形缓冲满导致事件丢失的机制。它可以配置阈值,当丢事件比例超过阈值时触发 log、alert 或 exit 等动作。该指标将丢事件变成可值班信号,帮助运维人员及时发现问题。此外,metrics 中的 kernel event/drop 计数提供更详细的趋势和按 CPU 分解的数据。

Falco 0.44 中 BPF iterators 的作用是什么?它如何帮助恢复状态?

BPF iterators 是 Falco 0.44.0 引入的机制,用于在启动时填充初始进程表,并在检测到丢事件等导致状态陈旧后愈合状态。它通过内核侧遍历 task/FD,避免用户态刮 /proc 的往返和字符串解析,提供更高效的回填。这有助于减少因丢事件导致的线程/FD 表空洞,从而避免规则字段变假。

Falco 0.44.1 中 disable_iterators 参数的作用是什么?在什么情况下会自动禁用 iterators?

disable_iterators 参数用于控制是否启用 BPF iterators。默认 false 表示启用,使用 iterators 进行启动填充和丢事件后愈合;设为 true 则禁用,回退到 procfs 查找。此外,只要 Falco 不在 host(root)PID 命名空间运行,iterators 会自动禁用,因为无法看到完整主机进程视图。

Falco 中 modern_ebpf 和 kmod 引擎在缓冲配置和丢事件处理上有哪些主要差异?

主要差异包括:modern_ebpf 支持 cpus_for_each_buffer 参数来调整 CPU 与缓冲的映射,而 kmod 没有对应参数;modern_ebpf 支持 BPF iterators 进行状态愈合,而 kmod 没有对称的 iterators 路径;在丢事件指标上,modern_ebpf 可以增加 iterator 相关计数,而 kmod 不应套用 iterators 计数解释。调参时需先确认引擎类型,避免在错误引擎上调整无效参数。

Falco 中如何区分丢事件和规则未命中?为什么不能混为一谈?

丢事件是指事件在进入规则引擎之前因缓冲满等原因丢失,而规则未命中是指事件到达引擎后条件为假或被异常吞掉。两者可以同时发生,但证据包不同。丢事件会导致状态表空洞,进而使规则字段变空,可能造成误判为无威胁。因此,排障时需先区分是丢事件还是规则未命中,再采取相应措施。

🏷️

标签

➡️

继续阅读