安全
eBPF 能够观测和理解所有的系统调用的能力,以及在 Packet 层和 Socket 层审视所有的网络操作的能力,基于此两者相结合,为系统安全提供了革命性的新思路 。在此革命未发生之前,传统模式是基于系统调用过滤、网络层过滤和进程上下文跟踪是在完全独立的系统中完成的,而 eBPF 的出现则统一了可观测性和各层面的控制能力,使得我们有更加丰富的上下文和更精细的控制能力,因而能创建更加安全的系统 。
性能追踪
eBPF 程序能够加载到 Trace points、内核及用户空间应用程序中的 Probe points,这种能力使我们对应用程序的运行时行为(Runtime Behavior)和系统本身 (System Itself)提供了史无前例的可观测性 。应用端和系统端的这种观测能力相结合,能在排查系统性能问题时提供强大的能力和独特的信息 。BPF 使用了很多高级数据结构,因此能非常高效地导出有意义的可观测数据,而不是像很多同类系统一样导出海量的原始采样数据 。
观测及监控
相比于操作系统提供的静态计数器(Counters、Gauges),eBPF 能在内核中收集和聚合自定义 Metric,并能从不同数据源来生成可观测数据 。这既扩展了可观测性的深度,也显著减少了整体系统开销,因为现在可以选择只收集需要的数据,并且后者是直方图或类似的格式,而非原始采样数据 。
上面讲述了 eBPF 的相关特性以及优点,最后,我们再了解下在基于当前的技术以及业务场景下,eBPF 应用的局限性,具体如下:
1、现有的环境下,eBPF 程序不能调用任意的内核参数,只限于内核模块中列出的 BPF Helper 函数 。
2、eBPF 字节码大小最初被限制为 4096 条指令,截止到内核 Linux 5.8 版本,当前已将放宽至 100 万指令(
BPF_COMPLEXITY_LIMIT_INSNS),可参考源码所示:include/linux/bpf.h,对于无权限的BPF程序,仍然保留 4096 条限制 ( BPF_MAXINSNS );新版本的 eBPF 也支持了多个 eBPF 程序级联调用,虽然传递信息存在某些限制,但是可以通过组合实现更加强大的功能 。
3、eBPF 堆栈大小被限制在 MAX_BPF_STACK,截止到内核 Linux 5.8 版本,被设置为 512;可参考源码所示: include/linux/filter.h,这个限制特别是在栈上存储多个字符串缓冲区时:一个char[256]缓冲区会消耗这个栈的一半 。目前没有计划增加这个限制,解决方法是改用 bpf 映射存储,它实际上是无限的 。
4、eBPF 程序不允许包含无法到达的指令,防止加载无效代码,延迟程序的终止 。
5、eBPF 程序中循环次数限制且必须在有限时间内结束,这主要是用来防止在 kprobes 中插入任意的循环,导致锁住整个系统;解决办法包括展开循环,并为需要循环的常见用途添加辅助函数 。Linux 5.3 在 BPF 中包含了对有界循环的支持,它有一个可验证的运行时间上限 。
综上所述,虽然 eBPF 技术在当前的环境下影响力强大,但是为了保证内核的处理安全和及时响应,内核中的 eBPF 技术也被进行着诸多的限制,或许,随着技术的发展和内核演进,基于 eBPF,我们可能会找出一个更为性价比的综合解决方案 。
- EOF -
推荐阅读
- linux 国产操作系统deepin系统从安装到惊喜
- linux服务器垃圾清理记
- 百万级数据下的mysql深度解析
- 2021 专业人士 Linux 系统 TOP 5
- linux中的makefile编写规则
- Linux服务器打造一个简单的文件共享系统
- 指甲解析你的运势走向
- 分布式系统 Etcd 解析
- Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
- Linux进程管理