首页 > 编程知识 正文

moflo xdp,xdp怎么转化成pdf

时间:2023-05-05 06:56:32 阅读:185274 作者:4869

论文:《The eXpress Data Path: Fast Programmable Packet Processing in the Operating System kernel》

大纲 高速数据包处理的挑战XDP设计性能评估XDP应用总结 高速数据包处理的挑战 高速数据包处理

How to drop 10 million packets per second

解决方案 kernel bypass: DPDK, 完全绕过内核协议栈,由专门的网络应用程序操作网络硬件,并为数据包处理任务分配一个或者多个专有的CPU; 优点:能够显著提升性能;缺点:重复造轮子,无法重用Linux内核网络栈提供的功能和安全机制;由于Docker共享Linux内核,无法与Docker容器环境集成; 本文提出的方案,xdp,xdp是一种基于事件的钩子(钩子是在正常运转的程序中添加的一个控制模块,如果没有钩子这个模块就是一个默认处理程序),它是挂载在网卡上的,当一个数据包到达网卡之后,xdp程序就可以对这个数据包进行处理,决定对数据包执行的操作,包括丢弃数据包、转发数据包到其他网卡、或者直接将数据包传递给上层网络协议栈。 优点:能够和Linux内核无缝衔接,可以使用内核提供的函数;缺点:性能稍逊于DPDK;

下面这张图是Linux内核协议栈处理数据包的一整个流程,xdp在内核为该网络数据包分配skb缓存之前对数据包作处理,图中绿色标注的是netfilter组件提供的hook点,其实就是内核网络栈根据iptables防火墙设置的规则决定对数据包的处理(丢弃、转发),对比就能发现,因为xdp可以在数据包刚到达网卡就丢弃该数据包,所以能够用来处理高速数据流量。

XDP programs can completely bypass the networking stack, which offers higher performance than a traditional kernel module that needs to hook into the existing stack.

XDP总体设计

XDP总体设计包括以下几个部分:

XDP驱动钩子:网卡驱动中XDP程序的一个挂载点,每当网卡接收到一个数据包就会执行这个XDP程序;XDP程序可以对数据包进行逐层解析、按规则进行过滤,或者对数据包进行封装或者解封装,修改字段对数据包进行转发等;eBPF虚拟机:并没有在图里画出来,一个XDP程序首先是由用户编写用受限制的C语言编写的,然后通过clang前端编译生成BPF字节码,字节码加载到内核之后运行在eBPF虚拟机上,虚拟机通过即时编译将XDP字节码编译成底层二进制指令; eBPF虚拟机支持XDP程序的动态加载和卸载;BPF maps(BPF映射):存储键值对,作为用户态程序和内核态XDP程序、内核态XDP程序之间的通信媒介,类似于进程间通信的共享内存访问;用户态程序可以在BPF映射中预定义规则,XDP程序匹配映射中的规则对数据包进行过滤等;XDP程序将数据包统计信息存入BPF映射,用户态程序可访问BPF映射获取数据包统计信息;eBPF程序校验器:XDP程序肯定是我们自己编写的,那么如何确保XDP程序加载到内核之后不会导致内核崩溃或者带来其他的安全问题呢?程序校验器就是在将XDP字节码加载到内核之前对字节码进行安全检查,比如判断是否有循环,程序长度是否超过限制,程序内存访问是否越界,程序是否包含不可达的指令;

结合上图,当一个数据包到达网卡,在内核网络栈分配缓冲区将数据包内容存到sk_buff结构体之前,xdp程序执行,读取由用户态的控制平面写入到BPF maps的数据包处理规则,对数据包执行相应的操作,比如可以直接丢弃该数据包,或者将数据包发回当前网卡,或者将数据包转发到其他的网卡或者上层的虚拟网卡(进而将数据包直接转发给上层的容器或者虚拟机),又或者将数据包传递给内核协议栈,再经过协议栈的逐层解析发送给用户程序,还可以直接将数据包通过AF_XDP这个特殊的socket直接转发给上层应用程序。

典型XDP程序流程

XDP程序的传入参数是一个xdp_md类型的结构体,包含指向数据包起始地址和末尾地址的指针,其定义在/include/uapi/linux/bpf.h头文件中。XDP程序首先会逐层解析数据包,首先是链路层,然后是网络层、传输层、应用层等等,解析之后XDP程序还可能修改数据包协议头部的某些字段,或者对数据包进行封装或者解封装,在这个过程中可能会调用内核提供的辅助函数,比如查询内核网络栈中的路由表或者重新计算校验和等,还可能通过辅助函数来查询或者更新BPF映射。

最后XDP程序会返回一个状态码,程序流会根据这个状态码对数据包执行具体的操作。比如,如果返回的是XDP_DROP这个数据包就会被丢弃,如果返回的是XDP_REDIRECT, 这个数据包可以被转发到其他的网卡上、指定的CPU或者通过AF_XDP Socket转发到用户空间的应用程序。

性能评估 丢包性能测试

这张图展示了丢包性能随着CPU核数的变化情况,对于只有一个核的情况,XDP的基准性能达到24Mpps,DPDK的基准性能达到43.5Mpps;二者的性能与核数成正比的关系,直到达到PCI总线的最大性能115Mpps。这张图还展示了Linux网络栈的丢包性能,一种是使用原始的iptables防火墙来丢包,另一种是使用带有连接跟踪模块的iptables防火墙,对于带有连接跟踪的iptables防火墙,单核的丢包性能只有1.8Mpps,原始的防火墙单核丢包性能为4.8Mpps,XDP的单核丢包性能是Linux网络栈丢包性能的五倍。

CPU使用率测试

这张图展示了DPDK、XDP和Linux网络栈在单核上CPU使用率随数据包负载的变化曲线,负载从0加到测试系统在单核上所能处理的最大流量,因为DPDK使用一个专门的核来做数据包处理,因此CPU使用率总是100%。XDP的CPU使用率相比于Linux网络堆栈和DPDK更低。

转发性能测试

从这张图可以看出DPDK和XDP的转发性能随着CPU核数的增长线性变化直到达到性能瓶颈,DPDK只支持在将数据包转发到不同的网卡,XDP同时支持将数据包转发到同一个网卡或者不同网卡。XDP在一个同一个网卡接口上转发性能在多核情况下高于DPDK在不同网卡上的转发。

XDP应用 实现路由功能

因为XDP程序能通过辅助函数直接访问内核网络栈中的路由表,所以可以用来实现路由功能,当数据包刚到达网卡就直接查路由表并转发到相应的网卡,这样可以不经过网络栈从而提高性能。图中XDP(full table)是包含所有的路由信息,而XDP(single route)只包含部分路由信息。

DDos防御

在这个实验中,XDP程序收到数据包根据生成的安全规则检查它是不是ddos流量,是的话就直接丢弃。在这个实验中,在主机间建立多个正常通信的TCP连接,同时逐渐增大UDP DOS攻击流量,可以看到xdp能够有效的防御DDOS攻击,这之后TCP连接降到0是因为处理流量达到了单核情况下XDP的性能极限。

负载均衡

表中展示了Facebook开源的由XDP实现的katran负载均衡组件和Linux内核IPVS负载均衡组件处理性能的对比,可以看到在单核情况下,Katran是IPVS的五倍。

总结

XDP:

将可编程的数据包处理模块集成到内核中;兼具性能和灵活性;受到Linux内核社区的支持;被广泛使用,包括知名开源项目:Cilium, Katran等等(https://github.com/zoidbergwill/awesome-ebpf)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。