编者按:eBPF(extended Berkeley Packet Filter) 是一种能够在 Linux 内核中运行用户编写的程序,而不须要批改内核代码或加载内核模块的技术。简略说,eBPF 让 Linux 内核变得可编程化了。本文整顿自龙蜥大讲堂第 57 期,浪潮信息 SE 王传国从原理上剖析了 eBPF 的加载工作过程,解释了它如何保证系统运行稳固以及它能减速网络的起因。
01 eBPF 加载过程
咱们晓得,个别 eBPF 的加载过程,首先是写 C 代码,而后用 llvm lang 编译成 ELF 文件,接着用 libelf 对 ELF 文件进行解析,解析之后依照 libbpf 所须要的格局进行数据的整顿、组织,再通过 BPF 的零碎调用,能够将这些数据都加载到内核外面,包含程序翻译进去的 eBPF 指令集。
在内核外面有校验器负责对程序进行校验,有 JIT 对程序进行翻译解析。
1.1 重定位
BPF 基础设施提供了一组无限的“稳固接口”,应用 convert_ctx_access 对各种 CTX 进行转换,在内核版本升级时保障稳固。
CO-RE 核心思想就是采纳 (BTF) 非硬编码的模式对成员在构造中的偏移地位进行形容,解决不同版本之间的差别。
须要重定位的元素:Map、函数调用、Helper 函数调用、字段、Extern 内核符号和 kconfig。
1.2 安全性查看:数据、指令、循环
数学计算除数不能为 0,指令调用范畴 [0, prog->len) 深度优先遍历排除环。
1.3 eBPF 指令集
1.4 指针安全性查看
确定指针类型、范畴纠正,辨认不了的指针类型不容许援用。
范畴查看,不同的指针类型有不同的查看办法和范畴。
02 eBPF 减速容器网络
次要波及的 eBPF 程序类型:XDP、tc、sock_ops。
它们减速网络性能的基本原理都是把数据间接从一端(网口 /socket)的发送队列传递到另一端的接管或发送队列,绕过不须要的网络协议栈。
XDP 位于整个 Linux 内核网络软件栈的底部,还未生成 skb,可能十分早地辨认并抛弃攻打报文,具备很高的性能;然而在虚拟机中有时候可能无奈反对 XDP 程序的加载,例如虚拟机网卡的接管队列太少。
在 tc 性能的 sch_handle_ingress、sch_handle_egress 增加 hook 点,别离是 tc ingress 和 tc egress,没有 XDP 那么多要求,基本上所有的 OS 中都能应用,绕过 netfilter 等非必要的内核网络协议栈门路,能极大地晋升网络性能,升高提早。
技术概述:把数据从一端 socket 发送队列间接发送到对端 socket 的接管队列或发送队列。
sockops:挂载到 cgroup,监控整个 cgroup 中所有 socket 的握手和挥手(被动 | 被动),记录 tcp 连贯。
sockmap:存储数据特色与 socket 句柄的关系。写数据时执行 bpf_map_update,批改对应 socket 的 sendmsg 函数指针。
sk_msg:应用 sockmap 对数据进行 redirect 断定。
通过咱们的测试,如果用 Cilium 替换 calico,用 TCP Throughput 模式测,那么 pod 间的通信性能 tcp 吞吐量晋升 58%、sockops 晋升 153%、跨节点也能晋升 24%。
如果用 TCP-RR 模式来测,那么相比 calico 同节点能晋升 28%、sockops 晋升 200.82%、跨节点晋升 43%。
如果用 TCP_CRR 模式去测的话,calico 同节点能晋升 40%、sockops 晋升 35%、跨节点晋升 55%。
Cilium 在晋升性能的时候,它对于 CPU 的占用升高了 10% 以上,因而咱们测试的后果是 Cilium 的性能要显著优于应用 iptables 的 calico。所以说目前咱们打算应用 Cilium 优化咱们的容器网络。
对于直播课件及视频回放获取形式:
【PPT 课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件”即可获取。有任何疑问请随时征询龙蜥助手—小龙(微信:openanolis_assis)。
【视频回放】:视频回放可返回龙蜥官网查看。
—— 完 ——