写点什么

从编译到可执行,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:5813019

评论

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

简简单单才是真,初试 Svelte

LeanCloud

肝了15000字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收藏

北游学Java

Java MySQL nginx tomcat JVM

Golang 对象池

escray

学习 极客时间 Go 语言 4月日更

前端规范之路

白玉兰开源

大前端 开发规范

Redis的适用场景简单剖析

大数据技术指南

redis 4月日更

前端⼤规模构建演进实践

白玉兰开源

架构 大前端

【转载】图形化系统开发组件X-Series(一)——XrossUnit介绍

赫杰辉

智汇华云 | ArSDN打通软件定义数据中心的“任督二脉”

华云数据

Redis为什么是单线程?高并发响应快?

Linux服务器开发

redis Linux服务器开发 网络io C++后端开发 单线程

软件测试——教育机构课程顾问常见黑话大全

程序员阿沐

程序员 软件测试 教育 机构 教育培训

一文搞定 Flink Job 的运行过程

shengjk1

flink flink源码 flink源码分析

分布式锁之Redis实现

Sakura

4月日更

【转载】提高系统开发效率的“银弹”——X-series可视化大规模应用开发工具集

赫杰辉

重磅来袭:Spring之RequestBody的使用姿势小结

学Java关注我

Java 编程 架构 技术 程序人生

前端DDD总结与思考

白玉兰开源

大前端 DDD

华云大咖说 | 华云数据与数科网维携手共建国产云生态

华云数据

GitHub开源:17M超轻量级中文OCR模型、支持NCNN推理

不脱发的程序猿

人工智能 GitHub 开源 OCR 4月日更

0门槛成为“技术牛人”!星环科技线上分享课“星课堂”开播,快来报名,一探究竟

星环科技

人工智能 数据库 云计算 大数据 直播技术

聪明人的训练(二十二)

Changing Lin

4月日更

从源码分析 MySQL 死锁问题入门

比伯

Java 编程 程序员 架构 计算机

一入爬虫深似海,从此早睡是路人

Thrash

2020年12月的面试经历:美团4面+字节4面(均已拿offer),面试真题分享

Java架构师迁哥

https如何使用python+flask来实现

华为云开发者联盟

Python flask https ssl HTTP协议

阿里巴巴的“双11”高并发秒杀终极版教程!(Java语言设计)

Java架构追梦

Java 阿里巴巴 架构 面试 秒杀架构设计

什么是Selenium?使用Selenium进行自动化测试

码语者

DevOps selenium

GitHub惊现!JVM G1GC的算法+实现,90张图+33段代码,你的面试专属!

Java架构师迁哥

家务活中的python协程

行者AI

协程 python学习

彻底搞懂ThreadLocal

千珏

Java 源码分析 多线程 ThreadLocal

4行指令解决pip下载Python第三方库太慢问题(pip更换国内下载源)

不脱发的程序猿

Python pip 4月日更 Python库安装

轻松带你学习java-agent

华为云开发者联盟

Java Trace Java虚拟机 java-agent 挂载

知识分享:SQL注入的流程和步骤

Thrash

sql

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