XDP技术——Linux网络处理的高速公路
XDP及相关技术简介
运行的XDP程序可以通过XDP动作码来指定驱动对网络数据包的后续动作:
• XDP_ABORTED意味着程序错误,会将数据包丢掉,与XDP_DROP不同之处在于XDP_ABORTED会用trace_xdp_exception记录错误行为。
• XDP_DROP会在网卡驱动层直接将该数据包丢掉,无需再进一步处理,也就是无需再耗费任何额外的资源。在收到DDoS攻击时,这种特性可以瓦解DDoS的根本目标——占满被攻击主机的CPU资源使得其他正常流量无法被处理,因为XDP丢包不会再动用额外的CPU资源。
• XDP_PASS会将该数据包继续送往内核的网络协议栈,和传统的处理方式一致。这也使得XDP可以在有需要的时候方便地使用传统的内核协议栈进行处理。
• XDP_TX会将该数据包从同一块网卡返回。
• XDP_REDIRECT则是将数据包重定向到其他的网卡或CPU,结合AF_XDP可以将数据包直接送往用户空间。
XDP具有三种运行模式:
• 原生模式:
即驱动模式,在该模式下的XDP程序运行在网络驱动程序的早期路径,需要网卡驱动程序的支持,而10G及以上速率的大多数网卡基本都是支持的;
• 卸载模式:
该模式会直接将XDP程序卸载到网卡上,从而彻底释放主机CPU资源,相较于原生模式,具有更高的性能。目前支持的网卡似乎只有Netronome智能网卡。
• 通用模式:
该模式下的XDP程序运行于驱动之后的位置,无需驱动支持,但性能较差,一般用于测试。
使用XDP技术进行快速的包处理具有如下优势:
• 是Linux内核的一部分。这是一个长期的解决架构方案,由Linux内核社区维护,如同内核的其他部分,具有稳定的API,无需修改内核,无需增加额外的软件框架。
• 使用与内核协同,而非完全内核旁路的方式。XDP可重用所有Linux上游的网络工具和驱动,能够复用内核访问硬件的安全模型。而DPDK等技术则需要使用其专属的网络和安全工具。
• 安全性。由于eBPF验证器(verifier)的存在,一些不安全的指令会被内核拒绝加载。
• 无需独占CPU资源。即便是在空负载的情况下,DPDK也需要使用忙轮询来进行收包检查,分配的CPU核永远是打满的。而XDP可以始终运行,只有在负载升高时才会开始占用CPU。同时XDP程序也是可以运行在多个CPU之上的,这进一步提高了其性能。
• 动态注入。eBPF程序可以随时重新挂载和更新。
• 无需分配巨页。
• 适用性强。高于4.8版本的内核和绝大多数高速网卡都是支持XDP的,无需专有硬件的支持。
• ……
XDP技术的使用
结 语
有收获,点个在看