2.2 高性能用户态网络协议栈:Gazelle
近些年,网络硬件的I/O(Input/Output,输入/输出)能力得到快速发展,性能已远超单核CPU的性能。现有内核网络协议栈受网卡中断、不可避免的上下文切换和复杂的netfilter控制面等因素的影响,即使借助网卡多队列和硬件卸载特性,也无法充分利用网络硬件的I/O能力。
在对网络I/O加速的多种技术中,用户态网络协议栈是一种常见且有效的技术手段。相比于内核网络协议栈,用户态网络协议栈的性能优势之一,体现在数据流路径中无须进行上下文切换。网络I/O线程往往与业务线程处于同一个上下文,且无共享数据,这可以避免数据流过程中的资源加锁和上下文切换,从而可以使网络性能得到最大程度的优化。
由于不同应用的线程模型不同,并且用户态网络协议栈无法适配多样化的线程模型,因此,即使采用用户态网络协议栈,也无法同时实现高性能与通用性。
Gazelle是基于DPDK(Data Plane Development Kit,数据平面开发套件)和LwIP(Lightweight TCP/IP stack,轻量级TCP/IP协议栈)开发的轻量级用户态网络协议栈,其在满足高性能、高可用的同时,具备良好的通用性和易用性,如图2-3所示。
图2-3 Gazelle兼顾高性能与通用性
Gazelle的架构如图2-4所示,由DPDK运行时、控制面、数据面、socket接口和运维5部分组成。DPDK运行时提供了用户态网卡收发包的EAL抽象层,支持用户态bond模式,并实现了ring无锁队列和mempool内存池;控制面负责将收到的报文数据根据软/硬件转发规则分发给数据面的各个协议栈线程;数据面采用轮询或中断模式接收数据包,经由TCP/IP协议处理完成后,通过事件唤醒机制通知应用接收数据;当应用调用socket接口时,会被LD_PRELOAD机制无感劫持到Gazelle提供的socket接口,并通过RPC(Remote Procedure Call,远程过程调用)无锁消息调用与协议栈通信,实现应用的数据收发;运维部分包括配置管理和流量统计。
图2-4 Gazelle的架构
Gazelle协议栈可以进行多核多线程部署,通过区域大页内存和动态绑核,避免NUMA陷阱。Gazelle借助RPC无锁消息调用解耦了应用线程与协议栈线程,从而支持任意的线程模型。
Gazelle具有以下四个优点。
1)高性能
极致性能:基于区域大页划分、动态绑核、全路径零拷贝等技术,可以避免资源的共享开销;基于数据读写与协议处理分离的设计,可以避免多线程锁竞争,从而达到性能最大化,实现高线性度并发协议栈。
硬件加速:支持checksum、TSO(TCP Segment Offload)、GRO(Generic Receive Offload)等硬件卸载,从而打通软硬件垂直加速路径。
2)通用性
POSIX兼容:接口完全兼容POSIX API,应用无须进行任何修改(零修改)。
通用网络模型:基于远程消息调用等机制实现自适应网络模型调度,协议栈与业务线程解耦,不受业务多样化的线程模型限制,满足任意网络应用场景。
3)易用性
即插即用:基于LD_PRELOAD实现业务免配套,真正实现零成本部署。根据不同的协议类型和用户配置来决定是走用户态路径还是走内核态路径,兼容内核,保证功能完备性。
4)易运维
运维工具:具备流量统计、指标日志、命令行等完整的运维手段。