写点什么

从编译到可执行,eBPF 加速容器网络原理分析

  • 2023-01-05
    北京
  • 本文字数:1322 字

    阅读完需:约 4 分钟

从编译到可执行,eBPF 加速容器网络原理分析

eBPF(extended Berkeley Packet Filter) 是一种可以在 Linux 内核中运行用户编写的程序,而不需要修改内核代码或加载内核模块的技术。简单说,eBPF 让 Linux 内核变得可编程化了。本文整理自龙蜥大讲堂第 57 期,浪潮信息 SE 王传国从原理上分析了 eBPF 的加载工作过程,解释了它如何保证系统运行稳定以及它能加速网络的原因。

1. 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 指针安全性检查



确定指针类型、范围纠正,识别不了的指针类型不允许引用。



范围检查,不同的指针类型有不同的检查方法和范围。

2. 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 优化我们的容器网络。

2023-01-05 10:5813382

评论

发布
暂无评论
发现更多内容

经验分享 | 搭建帮助中心的最强攻略

小炮

报名啦!中小企业如何借力AI逆势突围?飞桨中国行定档3月23日!

百度大脑

实用机器学习笔记二十六:NAS

打工人!

学习笔记 NAS 机器学习算法 3月月更 神经网络架构搜索

Hoo虎符研究院| 稳定币的主要分类及发展趋势

区块链前沿News

虎符研究院 稳定币

【Python训练营】Python每日一练----第31天: k倍区间

是Dream呀

3月月更

Flutter 图文并茂列表完整实现

岛上码农

flutter ios 安卓 移动端 3月月更

威胁驱动的网络安全方法论

喀拉峻

网络安全

优秀的测试开发应该具备的六大能力

老张

软件测试 测试开发

Eclipse 不为人所知的另一面 - 企业管理软件领域 ABAP 编程语言开发利器

汪子熙

eclipse ide 开发者 abap 3月月更

架构训练营毕业总结

Geek_e6f7f6

架构实战营

尤达DDD领域驱动设计思想 第一章作业(理解单纯的面向对象设计思想的缺陷)

代廉洁

尤达DDD领域驱动设计思想

AI语音识别-我给浏览器加了个语音搜索功能

DS小龙哥

语音识别 3月月更

使用关键点检测打造小工具Padoodle,让涂鸦小人跟随真人学跳舞

百度大脑

聊聊编程中的 “魔数”

程序员鱼皮

对称加密与非对称加密总结

暖蓝笔记

3月月更

有温度的人工智能,零门槛助力企业“鲤跃”智能化“龙门”

百度大脑

建设领先的AI原生云,百度智能云落地新一代高性能AI计算集群

百度大脑

纯CSS 神奇的边框特效

德育处主任

css3 纯CSS 前端可视化 css动画

一文彻底搞懂原型链

CRMEB

微博评论的高性能高可用计算架构

AragornYang

架构训练营 架构实战营

我给公司用了这款工具,领导直接给我涨了两千工资

刘祥

后端技术 编程工具

图灵奖得主Yann LeCun走进百度,与世界研究工作者展开交流

百度大脑

尤达 DDD 领域驱动设计思想 第二章作业(重新划分SmartRM的子域和限界上下文)

代廉洁

尤达DDD领域驱动设计思想

拿下10+OFFER总结的HR常问问题

暖蓝笔记

3月月更

免费机器资源、硬核导师、丰厚奖励|飞桨黑客马拉松第二期开始啦!

百度大脑

百度连续四年亮相全球量子信息处理顶会QIP 宣布量子战略规划升级

百度大脑

[算法练习]2 二进制中1的个数

暖蓝笔记

3月月更

vim 常用操作键tips

刁架构

xcode vim 快捷键

吉利控股集团与百度深化战略合作

百度大脑

模块化编程及LCD1602调试工具

謓泽

3月月更

做一个小程序到底要多少钱?都有哪些费用?

源字节1号

开源 前端开发 后端开发 开发小程序

从编译到可执行,eBPF 加速容器网络原理分析_文化 & 方法_王传国_InfoQ精选文章