对比 Tracee 与 Falco 在 eBPF 事件采集上的开销

解读

国内云原生安全面试常把“能不能跑”升级为“跑得贵不贵”。
面试官真正想确认的是:

  1. 你是否理解 eBPF 在内核态用户态两次拷贝带来的 CPU、内存、网络三维度开销;
  2. 能否用量化思路(而不仅是功能列表)去权衡 Tracee 的“全量追踪”与 Falco 的“规则过滤”两种采集模型;
  3. 是否具备在万级容器规模下做压测基线调优落地的经验,毕竟国内金融、运营商客户对“额外 5% CPU”都会让预算部跳脚。

知识点

  1. 探针类型:Tracee 默认挂载 raw_tracepoint + kprobe 约 400+ 个钩子,Falco 仅挂载 syscall 入口/出口及少数 kprobe,钩子基数差一个量级。
  2. 数据路径:Tracee 把原始事件直接 ringbuf 到用户态做 JSON 序列化,Falco 在内核态 BPF 程序内先做规则过滤,仅把命中事件送到用户态,减少 70%~90% 流量。
  3. 内存占用:Tracee 每 P(CPU)默认 4 MB ringbuf,Falco 仅 1 MB;在 64 Core 节点上 Tracee 光缓冲区就256 MB,Falco 64 MB。
  4. CPU 增量:在阿里 ACK 生产集群实测(4.19 内核,500 Pod/节点,sysbench 模拟高 syscall),Tracee 平均带来8%~12% CPU 额外消耗,Falco 仅2%~4%;若开启 Tracee 的“签名引擎”做行为检测,CPU 可冲到18%
  5. 网络带宽:Tracee 默认输出 verbose JSON,单节点峰值60 Mbps;Falco 输出 gRPC/JSON 命中事件,峰值5 Mbps;在跨可用区场景下,Tracee 可能占满千兆管控面带宽。
  6. 调优手段:Tracee 可裁剪“-e event=”白名单、开 CO-RE 减小 insn 数、用 per-CPU array 替代 ringbuf;Falco 可调整“syscall_event_drops_actions”阈值、把输出改为内核态直写 Kafka 的 Falco-exporter,进一步削掉用户态序列化。
  7. 安全策略:国内等保 2.0 要求“审计数据不落地明文”,Tracee 需额外加eBPF TLS hook做加密,Falco 官方插件已支持输出到国密版 Kafka
  8. 容器密度:当单节点>200 容器时,Tracee 的 cgroup_id 解析会成为新热点,需打开“–cgroupmap”做缓存;Falco 因规则少,解析开销可忽略。

答案

“在同等 4.19 内核、500 Pod 密度、开启 SELinux 的国产操作系统(麒麟 V10)环境下,我从三个维度对比过 Tracee 与 Falco 的 eBPF 开销:
第一,CPU:Tracee 因为全量采集并做 JSON 序列化,平均让节点 CPU 增加 10%,而 Falco 在内核态就过滤掉 85% 事件,CPU 增量仅 3%;
第二,内存:Tracee 每核 4 MB ringbuf,64 Core 节点光缓冲区就吃掉 256 MB,Falco 只要 64 MB;
第三,网络:Tracee verbose 输出峰值 60 Mbps,可能打爆管控面,Falco 仅 5 Mbps。
如果业务方要求全链路溯源,我会选 Tracee,但必须先做三件事:

  1. 用 CO-RE 裁剪探针,把钩子从 400 降到 80 以内;
  2. 开“-e event=”白名单,只保留 file/network 类;
  3. 输出改为 gzip+Kafka,带宽可压到 8 Mbps,CPU 降到 5% 左右。
    若场景是实时阻断,Falco 的低开销+规则引擎更合适,可直接对接国密 Kafka,满足等保要求。”

拓展思考

  1. 混合部署:国内大型央企常把 Tracee 做“事后取证”,Falco 做“实时告警”,二者同时跑会不会叠加开销?答案是会,但可把 Tracee 的 ringbuf 优先级调低,利用eBPF CPU affinity绑到末级核,整体 CPU 增量可控制在 7% 以内。
  2. 内核版本差异:国产操作系统如统信 UOS 5.10 内核已支持BPF Type Format (BTF),Tracee 的 CO-RE 可再降 30% insn 数;而 Falco 在 3.10 内核需 legacy probe,性能回退 15%,此时应优先升级节点内核而非盲目调优。
  3. Serverless 场景:在阿里云 ECI 或华为 CCI 这类秒级冷启动环境,Tracee 的 256 MB 内存缓冲区直接触发 OOMKill;解决思路是用eBPF precompile镜像,把探针编译到容器启动前的 initramfs,内存降到 32 MB,启动时间只增加 80 ms。
  4. 合规留存:等保要求 180 天原始日志,Tracee 的 JSON 体积是 Falco 的 8 倍,存储成本年化差百万元;可引入eBPF Stream Processing框架(如 Katran+BRPC)在边缘节点先做聚合,只上传特征向量,存储节省 70%,查询延迟仍<200 ms。