1. 数据中心面临的问题
随着滴滴云规模的不断扩大,业务层面对延迟以及带宽的要求越来越高。2018 年滴滴云网络团队上线了基于开源社区的 OVS-DPDK 方案。DPDK 是 X86 平台报文快速处理的库和驱动的集合, 其主要优势为通过 Bypass Linux 内核,Hugepage 内存以及 PMD(Poll Mode Driver)模型驱动的方式实现加速。我们为 OVS-DPDK 提供了在线热升级功能,该功能保证了在升级过程中虚拟机业务无感知,并且网络 Downtime 时间为毫秒级别。同时我们优化了 OVS-DPDK 数据转发平面。实现了不同物理主机上的虚拟机网络延迟<150us,单核性能约~400w pps(双向)。(具体介绍见使用 OVS-DPDK 加速滴滴云网络)
滴滴内部上云、高性能计算 HPC,以及机器学习,对网络提出了更高的要求。通过 CPU DPDK 处理报文的方式,虽然在性能以及延迟方面远优于基于 Linux 内核的转发实现。但 CPU DPDK 已经不能满足数据中心流量激增带来的需求。
2. 技术方案选择
云网络环境中,在计算节点 DPDK 不会占用过多的 CPU,否则会影响 CPU 售卖,一般会使用 1-2 CPU 用于数据报文处理。同时 DPDK 处理数据报文的性能强依赖 CPU 算力。因此在计算节点网络的横向扩展以及纵向扩展都具有局限性。
在边际网关节点,我们可以通过扩展服务器的方式,提高网络处理容量进而满足业务需求。但是大规模的扩展服务器,需要承担更多的机器、功耗以及运维成本。
软件定义网络(Software Defined Network,SDN)是一种新型网络创新架构,是网络虚拟化的一种实现方式。其核心思想是将网络设备的控制面与数据面分离开来。控制层面可以通过集中控制的方式实现不同的业务逻辑:拓扑发现,路由管理,安全策略,网络虚拟化等。数据平面更专注在数据报文转发。2018 年 AWS re:Invent,AWS 介绍了 Nitro System。该系统通过硬件芯片加速虚拟机 IO 处理(网络、存储、安全等)。
目前工业界,加速网络处理的焦点聚集到了硬件层面:AISC,FPGA,P4,可编程网卡,以及智能网卡等。
3. 基于可编程芯片的解决方案
3.1 硬件芯片选择
传统 AISC 卡
该卡比较成熟,但业务逻辑固定,很难适应云上复杂的业务场景。
可编程门队列 FPGA
FPGA 实现网络加速需要专业 FPGA 技术人员,以及专业网络 RD。同时在成本,和研发周期都需要具有一定的局限性。
P4
P4 具有灵活的可编程性,较为合适做为网关节点数据处理。并不适合在计算节点使用。同时价格也是需要考虑的因素。
可编程网卡芯片
通过调研发现,可编程网卡除了具有通用网卡的功能外,还可以通过下发流表规则的方式,实现报文匹配并对报文执行特定的 action 如:修改,封装,以及转发、上送报文至 CPU 等。这种具有灵活性、可编程性的硬件芯片,能够满足快速迭代的需求。
3.2 转发模型
为了满足网元业务灵活性、多样性的需求,我们将网元业务和底层平台功能分离,舍去了传统的数据面 Pipeline 转发模型,采用了类似 Open Flow 的 macth+action 的方式。这样不同的 match 规则和不同 action 匹配能够实现不同的业务逻辑。这种弱依赖的关系能够剥离了业务和底层细节,方便业务功能迭代、快速上线,同时底层可编程芯片的更新不会对业务逻辑产生影响。
3.3 网络平台化
随着云上业务场景的复杂化,以及上云的客户越来越多,云上网络的功能也复杂化。为了统一计算节点以及网关节点功能,我们实现了统一的编程框架。这样能够快速开发不同功能的网关节点,减少运维负担。
3.4 落地实践
我们基于 OVS-DPDK Offload 框架实现流表规则 offload。OVS 采用首个报文触发的方式下发硬件流表规则,该方式的优点为在必须的时候下发规则,能够达到节省流表的目的,但是缺点却会导致首个报文延迟。经调研我们发现网卡支持至少百万级流表量(使用 x86 内存或者其他扩展内存),最终我们舍去 OVS-DPDK ofproto 转发层,使用 dpctl 接口下发流表,这样就不存在首个报文延迟问题,同时也缩减了使用 TC Flower 时数据面过多问题(这些转发平面包括:硬件芯片转发,TC 数据面,OVS Linux 内核模块转发,以及 ofproto 层)。我们修改了 OVS-DPDK 流表老化方式,保证通过 dpctl 下发的规则不会被删除。最后通过 upcall limit 限制了 upcall 报文处理。
滴滴云网络数据平面主要分为两大部分:计算节点和网关节点。计算节点主要负责虚拟机、容器网络的虚拟化,网关节点主要负责各种边际节点业务如:SLB 负载均衡、vRouter EIP 报文处理,分流器、SNAT、FullNAT、云企业网等。可编程网卡芯片通过平台化的方式在两个主要节点均有应用。
SLB 负载均衡
提供四层负载均衡,根据用户策略将 underlayer 网络报文分发到虚拟网络服务节点。
vRouter
提供弹性 EIP 服务。用户可以将一个公网 IP 地址绑定到虚拟机、容器、或者裸金属,从而获得公网访问功能。
iRouter
将滴滴数据中心和滴滴云虚拟网络打通,滴滴数据中心可以方便快捷的访问云上资源。
SNAT
为虚拟机、容器以及裸金属提供访问公网服务。
云企业网互联
互联服务支持将滴滴云上的多个 VPC 网络加入云互联,任意两个 VPC 网络即可实现资源之间的互访。
计算节点
在计算节点主要有两大应用场景:一种场景为在计算节点为虚拟机、容器提供 VPC 服务(网络隧道,限速,转发,报文修改,公网服务),RDMA 网络。另外一个场景使用智能网卡为裸金属提供 VPC 服务。
3.5 遇到的问题
在调研开发过程中遇到诸多问题,在这里和大家总结分享下:
OVS-DPDK 支持 Offload 程度有限
首先 OVS 社区并对 DPDK Offload 接口(rte flow)支持有限:实现的 action 非常有限。需要使用者独立完成开发:如 set action,meter offload,vxlan 隧道报文处理等。
端口转发限制
目前 mellanox 网卡芯片并不支持从一个 PF 端口转发到该芯片另一个端口, 最终我们通过 SRIOV+Hairpin 的方式解决该问题。据了解后续的网卡芯片开始支持该功能(功能也受限于固件)。
Open vSwitch Crash
在删除包含 meter action 流表规则时,OVS 进程退出。该问题最终确认为 DPDK 的一个 bug,目前该问题已经修复,发送到社区并接收。http://git.dpdk.org/next/dpdk-next-net/commit/?id=0d7d180a0dda4b97021fc1f580d6bfe3b42a332d
调用 DPDK Meter API 接口导致 crash。目前该问题已经修复,发送到社区并接收。
http://git.dpdk.org/next/dpdk-next-net/commit/?id=4f19f4140e058c92822f228dcdc55c44bd88b613
修改 OVS 配置导致删除 offload flow crash,目前该问题已经修复,发送到社区并接收。https://github.com/openvswitch/ovs/commit/058b80d3de31b2c539d9e6f5f6687bde78ef08e9
Meter offload
OVS 社区没有实现该功能,我们根据业务特征抽象出接口并在 OVS 实现了 meter offload。该系
列补丁文件正在 OVS 社区 review,不久会进入 upstream。
Decap/Encap 流表限制
下发多条带有 decap/encap 的流表规则时报错。该问题最终确认为 DPDK 的一个 bug,目前该问题已经修复,与社区 maintainer 协同修复。http://git.dpdk.org/next/dpdk-next-net/commit/?id=64927f72a72fad39898b084e0cf66cc97b40959f
Decap + Meter action 限制
decap + meter 做为 action 下发规则时失败。该问题最终确认为 DPDK 的一个 bug,目前该问题已经修复,与社区 maintainer 协同修复http://git.dpdk.org/next/dpdk-next-net/commit/?id=431f199883e5b7eeea87a2f9f0272daf3354c1da
Hairpin 性能问题
在高并发情况下,mellanox 网卡芯片性能会下降约 40%,最终确认是网卡驱动 hairpin 问题。目前 mellanox 确认该问题并给出修复方式。
流表数目限制
通过删除流表上限修复该问题:https://github.com/openvswitch/ovs/commit/df5c293642cc07013e796e588eb7aead917e20a1
MAC 地址对 VxLAN 的影响
物理主机源 MAC 地址变更后 vxlan 报文依旧使用原来 MAC 地址,这样会导致收不到响应报文:
多次修改报文不生效问题
多次使用 TC Flower pedit 修改报文,offload 不生效问题, 最终确认是内核驱动问题:
配置 vf rate、mac 不当导致内核 crash
3.6 性能数据
以实现的 vRouter 弹性公网网关为例(基础网络 10Gpbs):
|pps(64B)||Mpbs(64B)||pps(1500B)||Mpbs(1500B)|
|-|-|-|-|
|9495892||8660.25||811935||10067.98|
业务延迟数据如下(使用 pktgen-dpdk latency):
|背景流量||网关延迟||10W 条流表以及并发 1Gbps 64B 流量|
|-|-|
|3u||10W 条流表以及并发 5Gbps 64B 流量||6u|
4. 开源社区贡献
除了为开源社区提供 bug patch,我们也将新增特性、性能优化 patch 回馈至开源社区:OVS、DPDK、Linux 内核社区(约 80+ patch), 其中 Linux 内核补丁列表如下:
作者介绍:
专注于高性能网络技术,从事云网络研发工作。活跃于 Linux 内核、OVS、DPDK 开源社区。
本文转载自公众号滴滴技术(ID:didi_tech)。
原文链接:
评论