关于eBPF与可观测性,你想知道的都在这里( 二 )


为了满足更细粒度的观测需求 , 通常需要引入额外的代码来实现数据收集、行为分析等 。 所以 , 开销问题自然就成为了大家关注的焦点 。 同时 , 与大量的引用代码一同而来的是更多的安全隐患 。
赵晨雨说 , 大家都希望能够在不改变系统状态的前提下 , 通过引入新的工具或数据源来查看当前系统内部的工作状态 , 但工具只要在系统上运行 , 就一定会带来开销 , 损耗在多大时可以认为没有改变系统状态呢?这并没有一个明确客观的定义 。
eBPF带来新的解题思路当前 , 现代软件系统的规模正在呈指数型增长 , 服务之间的交互异常复杂 。 在这种场景下 , 传统NPM、APM无法有效地实现全链路问题追踪 , 只能通过碎片化的信息追因 。 而在当每一个子系统及组件具有可观测性的能力后 , 便可以实现无侵入情况下的快速排障 , eBPF就是这样一种有效的手段 。
eBPF是什么
eBPF起源于Linux内核 , 是Linux内核一种革命性的技术 , 可以在内核中运行沙盒程序 。 该技术可以安全而高效地扩展内核的能力 , 而无需修改内核源代码或者装载内核模块 。 同时可以弥补可观测性所具有的观测盲点、数据深度限制等不足 。
以JavaScript为例 , 可以帮助大家更好地理解eBPF 。
众所周知 , JavaScript可以在网页中实现复杂功能 , 能够很容易地将一段代码嵌入到网页中 , 使网页不再是静态内容 。 以此类比 , eBPF可以将任何一段代码嵌入到操作系统或用户态的任何一个函数上 , 可以在内核中实现功能 , 使内核不再是难以触碰到的 。
eBPF架构模型
eBPF分为用户空间程序和内核程序两个部分 。
关于eBPF与可观测性,你想知道的都在这里
文章图片
用户空间程序负责加载eBPF字节码至内核 , 如需要也会负责读取内核回传的统计信息或事件详情;内核中的eBPF字节码负责在内核中执行特定事件 , 如需要也会将执行的结果通过eBPFMaps或者Perf-event事件发送至用户空间;其中用户空间程序与内核eBPF字节码程序可以使用Maps结构实现双向通信 , 这为内核中运行的eBPF字节码程序提供了更加灵活的控制 。 同时 , eBPF程序注入到内核之前会经过验证器 , 保证其是“内核安全的” 。
eBPF的优势
关于eBPF与可观测性,你想知道的都在这里
文章图片
编译方面 , eBPF支持即时(JIT)编译器 , 字节码被编译完成后会直接调用eBPF而不是对每个方法的字节码进行新的解释;安全方面 , eBPF程序的验证步骤确保资源不会被运行无限循环的程序阻塞;出错模式方面 , eBPF提供ErrorMessage帮助实现代码优化;资源访问方面 , eBPF为同时保证安全性与通用性 , 提供Helpers方法 , 几乎可以访问全部内核导出的数据 。
eBPF使用注意事项
首先 , 在开发运行方式上 , eBPF当前没有完整的开发流程 , 同时可用资料较少 , 这会使开发难度大幅增加 。
其次 , eBPF开发成功后会编译成字节码下发至内核 , 校验器对程序内部进行检验 , 其中包括指令与数目的限制 。 当eBPF程序段超过一定的指令数后 , 会被禁止执行 , 这会直接导致复杂逻辑难以实现 。
再者 , eBPF对内核内存的访问有严格限制 , 大多数情况下只允许读取 , Write能力十分受限 。 正是如此 , eBPF多用作可观测性 , 而很少使用其做调度优化等 。
虽然使用eBPF在一定程度下能够带来性能的提升 , 但它本身也存在非常多的限制 , 所以要对使用场景的具体情况进行具体分析 , 绝不能“一刀切” , 王张军总结道 。