写点什么

可编程网卡芯片在滴滴云网络的应用实践

2020 年 8 月 31 日

可编程网卡芯片在滴滴云网络的应用实践

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 硬件芯片选择

  1. 传统 AISC 卡

  2. 该卡比较成熟,但业务逻辑固定,很难适应云上复杂的业务场景。

  3. 可编程门队列 FPGA

  4. FPGA 实现网络加速需要专业 FPGA 技术人员,以及专业网络 RD。同时在成本,和研发周期都需要具有一定的局限性。


  5. P4

  6. P4 具有灵活的可编程性,较为合适做为网关节点数据处理。并不适合在计算节点使用。同时价格也是需要考虑的因素。


  7. 可编程网卡芯片

  8. 通过调研发现,可编程网卡除了具有通用网卡的功能外,还可以通过下发流表规则的方式,实现报文匹配并对报文执行特定的 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、云企业网等。可编程网卡芯片通过平台化的方式在两个主要节点均有应用。



  1. SLB 负载均衡

  2. 提供四层负载均衡,根据用户策略将 underlayer 网络报文分发到虚拟网络服务节点。

  3. vRouter

  4. 提供弹性 EIP 服务。用户可以将一个公网 IP 地址绑定到虚拟机、容器、或者裸金属,从而获得公网访问功能。

  5. iRouter

  6. 将滴滴数据中心和滴滴云虚拟网络打通,滴滴数据中心可以方便快捷的访问云上资源。

  7. SNAT

  8. 为虚拟机、容器以及裸金属提供访问公网服务。

  9. 云企业网互联

  10. 互联服务支持将滴滴云上的多个 VPC 网络加入云互联,任意两个 VPC 网络即可实现资源之间的互访。

  11. 计算节点

  12. 在计算节点主要有两大应用场景:一种场景为在计算节点为虚拟机、容器提供 VPC 服务(网络隧道,限速,转发,报文修改,公网服务),RDMA 网络。另外一个场景使用智能网卡为裸金属提供 VPC 服务。


3.5 遇到的问题

在调研开发过程中遇到诸多问题,在这里和大家总结分享下:


  1. OVS-DPDK 支持 Offload 程度有限

  2. 首先 OVS 社区并对 DPDK Offload 接口(rte flow)支持有限:实现的 action 非常有限。需要使用者独立完成开发:如 set action,meter offload,vxlan 隧道报文处理等。

  3. 端口转发限制

  4. 目前 mellanox 网卡芯片并不支持从一个 PF 端口转发到该芯片另一个端口, 最终我们通过 SRIOV+Hairpin 的方式解决该问题。据了解后续的网卡芯片开始支持该功能(功能也受限于固件)。

  5. Open vSwitch Crash

  6. 在删除包含 meter action 流表规则时,OVS 进程退出。该问题最终确认为 DPDK 的一个 bug,目前该问题已经修复,发送到社区并接收。http://git.dpdk.org/next/dpdk-next-net/commit/?id=0d7d180a0dda4b97021fc1f580d6bfe3b42a332d

  7. 调用 DPDK Meter API 接口导致 crash。目前该问题已经修复,发送到社区并接收。

  8. http://git.dpdk.org/next/dpdk-next-net/commit/?id=4f19f4140e058c92822f228dcdc55c44bd88b613

  9. 修改 OVS 配置导致删除 offload flow crash,目前该问题已经修复,发送到社区并接收。https://github.com/openvswitch/ovs/commit/058b80d3de31b2c539d9e6f5f6687bde78ef08e9

  10. Meter offload

  11. OVS 社区没有实现该功能,我们根据业务特征抽象出接口并在 OVS 实现了 meter offload。该系

  12. 列补丁文件正在 OVS 社区 review,不久会进入 upstream。

  13. Decap/Encap 流表限制

  14. 下发多条带有 decap/encap 的流表规则时报错。该问题最终确认为 DPDK 的一个 bug,目前该问题已经修复,与社区 maintainer 协同修复。http://git.dpdk.org/next/dpdk-next-net/commit/?id=64927f72a72fad39898b084e0cf66cc97b40959f

  15. Decap + Meter action 限制

  16. decap + meter 做为 action 下发规则时失败。该问题最终确认为 DPDK 的一个 bug,目前该问题已经修复,与社区 maintainer 协同修复http://git.dpdk.org/next/dpdk-next-net/commit/?id=431f199883e5b7eeea87a2f9f0272daf3354c1da

  17. Hairpin 性能问题

  18. 在高并发情况下,mellanox 网卡芯片性能会下降约 40%,最终确认是网卡驱动 hairpin 问题。目前 mellanox 确认该问题并给出修复方式。

  19. 流表数目限制

  20. 通过删除流表上限修复该问题:https://github.com/openvswitch/ovs/commit/df5c293642cc07013e796e588eb7aead917e20a1

  21. MAC 地址对 VxLAN 的影响

  22. 物理主机源 MAC 地址变更后 vxlan 报文依旧使用原来 MAC 地址,这样会导致收不到响应报文:

  23. https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6707f74be8621ae067d2cf1c4485900e2742c20f

  24. 多次修改报文不生效问题

  25. 多次使用 TC Flower pedit 修改报文,offload 不生效问题, 最终确认是内核驱动问题:

  26. https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=218d05ce326f9e1b40a56085431fa1068b43d5d9

  27. 配置 vf rate、mac 不当导致内核 crash

  28. https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=6e77c413e8e73d0f36b5358b601389d75ec4451c

  29. https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=24319258660a84dd77f4be026a55b10a12524919


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)。


原文链接


可编程网卡芯片在滴滴云网络的应用实践


2020 年 8 月 31 日 10:00784

评论

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

8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理

古时的风筝

函数式接口 Lambda stream Java 25 周年

架构师训练营作业--Week1

吴炳华

讲一个程序员如何副业月赚三万的真实故事

非著名程序员

程序员 独立开发者 副业赚钱 提升认知

解决出海网络难题 融云保障 MiniJoy 千万印度用户流畅互动

Geek_116789

食堂就餐卡系统设计

于成

「架构师训练营」Week01 作业+总结

PowerZhang

极客大学架构师训练营

架构师训练营作业

邵帅

论一个前端工程师的自我修养

萧文翰

ios android 开发者 前端 Web

[Go] 写一个守护协程的通用套路是什么?

eddix

golang pattern

神奇的梦想

泰稳@极客邦科技

身心健康 个人成长 目标管理

比Webpack更高效的Rollup入门指南

费马

Rollup 打包 前端工程化 webpack

重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

小傅哥

设计模式 小傅哥 重构 代码质量 代码坏味道

架构师训练营第1周学习总结

Season

极客大学架构师训练营

架构师训练营第一周总结

邵帅

【大厂面试04期】讲讲一条MySQL更新语句是怎么执行的?

NotFound9

MySQL 数据库 后端

架构师训练营第一周总结

Hugo

初步架构想法

极客大学架构师训练营

剖析Golang Context:从使用场景到源码分析

伴鱼技术团队

golang 源码分析 并发编程 程序语言 Context

if语句

拾贝

switch 语句

拾贝

食堂就餐卡系统设计

Lane

第一周.UML课后作业

西柚

UML

游戏夜读 | 毛利率有多少?

game1night

四个和成长有关的小故事

泰稳@极客邦科技

团队管理 TGO鲲鹏会 团队组织 职业成长

架构课程心得

dj_cd

极客大学架构师训练营

数据类型转换

拾贝

极客时间第0期架构师训练营第一周总结

2流程序员

再下一城 三六零收购织语CCwork深化“智慧办公”生态布局

人称T客

UML 建模

师哥

食堂就餐卡系统设计

Season

极客大学架构师训练营

架构设计作业1——食堂就餐卡系统设计

Andy风

微服务架构下如何保证事务的一致性

微服务架构下如何保证事务的一致性

可编程网卡芯片在滴滴云网络的应用实践-InfoQ