mininet编程实现交换机规则的插入、删除与修改。_可编程网卡芯片在滴滴云网络的应用实践...

02e840df0879f9294f6e8ce06135e525.png

24764b9cc404f193d1c1ec6142bd08dc.png

桔妹导读:随着云规模不断扩大以及业务层面对延迟、带宽的要求越来越高,采用DPDK 加速网络报文处理的方式在横向纵向扩展都出现了局限性。可编程芯片成为业界热点。本文主要讲述了可编程网卡芯片在滴滴云网络中的应用实践,遇到的问题、带来的收益以及开源社区贡献。

1. 数据中心面临的问题4be1987b1330a3a5bff3796816ec760f.png

随着滴滴云规模的不断扩大,业务层面对延迟以及带宽的要求越来越高。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. 

技术方案选择

4be1987b1330a3a5bff3796816ec760f.png

云网络环境中,在计算节点DPDK不会占用过多的CPU,否则会影响CPU售卖,一般会使用1-2 CPU用于数据报文处理。同时DPDK 处理数据报文的性能强依赖CPU算力。因此在计算节点网络的横向扩展以及纵向扩展都具有局限性。

在边际网关节点,我们可以通过扩展服务器的方式,提高网络处理容量进而满足业务需求。但是大规模的扩展服务器,需要承担更多的机器、功耗以及运维成本。

软件定义网络(Software Defined Network,SDN)是一种新型网络创新架构,是网络虚拟化的一种实现方式。其核心思想是将网络设备的控制面与数据面分离开来。控制层面可以通过集中控制的方式实现不同的业务逻辑:拓扑发现,路由管理,安全策略,网络虚拟化等。数据平面更专注在数据报文转发。2018年AWS re:Invent,AWS 介绍了Nitro System。该系统通过硬件芯片加速虚拟机IO处理(网络、存储、安全等)。

e63e9e253caf7e3216a250e3057dd5d6.png

目前工业界,加速网络处理的焦点聚集到了硬件层面:AISC,FPGA,P4,可编程网卡,以及智能网卡等。

3. 

基于可编程芯片的解决方案

4be1987b1330a3a5bff3796816ec760f.png

3.1 硬件芯片选择

  1. 传统AISC卡

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

  2. 可编程门队列FPGAFPGA 实现网络加速需要专业FPGA技术人员,以及专业网络RD。同时在成本,和研发周期都需要具有一定的局限性。e853bcf5f3cc619eb38dc0e2b1f642af.png
  3. P4

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

    731b4012fb8bbe812f8c68f93933cbd7.png
  4. 可编程网卡芯片通过调研发现,可编程网卡除了具有通用网卡的功能外,还可以通过下发流表规则的方式,实现报文匹配并对报文执行特定的action如:修改,封装,以及转发、上送报文至CPU等。这种具有灵活性、可编程性的‍‍硬件芯片,能够满足快速迭代的需求。c82ff1d6e38cfdb8a88838ef2c1eb034.png
3.2 转发模型为了满足网元业务灵活性、多样性的需求,我们将网元业务和底层平台功能分离,舍去了传统的数据面Pipeline转发模型,采用了类似Open Flow的macth+action的方式。这样不同的match规则和不同action 匹配能够实现不同的业务逻辑。这种弱依赖的关系能够剥离了业务和底层细节,方便业务功能迭代、快速上线,同时底层可编程芯片的更新不会对业务逻辑产生影响。

4e5d42e13a73c314d9959974334c39bc.png

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、云企业网等。可编程网卡芯片通过平台化的方式在两个主要节点均有应用。

d5ef8bcbd4f2f55353c2a0c61cedb48a.png

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

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

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

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

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

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

3.5 遇到的问题

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

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

  2. 端口转发限制

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

  3. 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

  4. Meter offload

    OVS社区没有实现该功能,我们根据业务特征抽象出接口并在OVS实现了meter offload。该系 列补丁文件正在OVS 社区review,不久会进入upstream。

  5. Decap/Encap 流表限制

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

  6. Decap + Meter action限制

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

  7. Hairpin 性能问题

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

  8. 流表数目限制

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

  9. MAC 地址对VxLAN的影响

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

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

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

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

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

  11. 配置vf rate、mac不当导致内核crashhttps://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/? id=6e77c413e8e73d0f36b5358b601389d75ec4451c

    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)
94958928660.2581193510067.98
业务延迟数据如下(使用pktgen-dpdk latency):
背景流量网关延迟
10W条流表以及并发1Gbps 64B流量3u
10W条流表以及并发5Gbps 64B流量6u
4. 开源社区贡献4be1987b1330a3a5bff3796816ec760f.png

除了为开源社区提供 bug patch,我们也将新增特性、性能优化patch回馈至开源社区:OVS、DPDK、Linux 内核社区(约80+ patch), 其中Linux 内核补丁列表如下:

b288eea94474f9d3e3fd1a5358f840b4.png

cd888de39d36171b82c50c9d49269f93.png团队介绍

滴滴云平台事业群滴滴SDN网络团队负责云网络产品的规划、设计、以及研发等工作。为公有云提供负载均衡SLB、专有网络VPC、弹性公网EIP、SNAT 以及云互联等服务。团队针对云网络业务需求,在Linux 内核网络虚拟化、DPDK、OVS、可编程芯片、RDMA、智能网卡以及系统优化等领域均有广泛深入的研究。团队具有多名开源社区contributor,涉及OVS、DPDK、Linux 内核等。

作者介绍4e8e544fadc18665b95e7c770d546eac.png专注于高性能网络技术,从事云网络研发工作。活跃于Linux 内核、OVS、DPDK开源社区。延伸阅读

dbff0728b08d5aaf5b4550b0f905ed5e.png

b75a2496d8b164355819951baa1f4df1.png

b7c4d6c2531aa5cb15157b221ac91b08.png

内容编辑 | Charlotte & Teeo联系我们 | DiDiTech@didiglobal.com

a0cded487f2d96b31d4de63eb5e0cb1d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos8上docker tomcat容器访问报404解决方法

目录 【README】 【1】docker安装tomcat 【2】启动多个tomcat容器 【README】 1.本文记录了 访问docker tomcat容器报404的解决方法&#xff1b; 2.附带安装tomcat步骤&#xff1b; 3.centos8 安装docker&#xff0c;refers2 centos8安装docker_PacosonSWJTU的博客-CSDN博…

ConcurrentHashMap--自用,非教学

结论先行&#xff0c;细节在下面 jdk1.7是如何解决并发问题的以及完整流程 一.首先new一个concurrentHashMap 调用默认构造方法 二.初始化 初始化initialCapacity&#xff08;默认是16&#xff0c;指一个segment内Entry的数量&#xff09;&#xff0c;loadFactor&#xff…

Java开发必须掌握的线上问题排查命令

转载自 Java开发必须掌握的线上问题排查命令作为一个合格的开发人员&#xff0c;不仅要能写得一手还代码&#xff0c;还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等&#xff0c;还包括的就是线上问题的排查。由于在生产环境中&#x…

centos8启动docker-mysql8容器

【README】 本文记录了 centos8 安装&#xff0c;启动mysql8的docker容器的步骤&#xff1b; 【1】安装mysql8 docker容器 步骤1&#xff0c; 查看mysql8 docker镜像版本 &#xff1b; 最简单的方式是上 Docker Hubhttps://hub.docker.com/直接搜索mysql&#xff0c;查看其 …

Java命令学习系列(一)——Jps

转载自 Java命令学习系列&#xff08;一&#xff09;——Jpsjps位于jdk的bin目录下&#xff0c;其作用是显示当前系统的java进程情况&#xff0c;及其id号。 jps相当于Solaris进程工具ps。不象"pgrep java"或"ps -ef grep java"&#xff0c;jps并不使用应用…

springboot2.5.5配置druid数据源1.2.8与jdbc

【README】 本文记录了 springboot配置 druid数据源的步骤&#xff1b; 【1】新建springboot项目并配置druid 步骤1&#xff0c;新建springbt项目 步骤2&#xff0c;选择spring web&#xff0c;jdbc&#xff0c;mysql驱动依赖&#xff1b; 步骤3&#xff0c;添加 druid数据源…

tsc244标签编辑软件_能打小票的标签机,M110智能标签打印机来了!

每张被贴上的标签背后&#xff0c;都是对待梦想的认真、对待生活的用心&#xff0c;M110智能标签打印机为你标记美好&#xff0c;实现品质与效率兼得的追求。01、 产品简介M110智能标签打印机采取热敏无墨打印技术&#xff0c;无需碳带&#xff0c;便捷经济&#xff0c;配套“标…

面试官:简述实现一个线程池的设计思路

前言 二面碰到这个问题人都麻了&#xff0c;我扯了好多没用的&#xff0c;面后赶紧来补一下&#xff0c;但是找到的基本都是一堆纯代码&#xff0c;不是讲思路的。下面的思路是我参考美团技术团队文章后总结的。 具体思路 一、总体设计 线程池在内部实际上构建了一个生产者…

Java命令学习系列(四)——jstat

转载自 Java命令学习系列&#xff08;四&#xff09;——jstatjstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据&#xff0c;在没有GUI图形的服务器上&…

修改打印机ip工具_使用富士施乐一体机因动态IP导致不能打印与扫描的解决方法...

背景在使用富士施乐的一体机中(其他厂商的一体机 也类似)&#xff0c;很多人的网络环境是动态IP的&#xff0c;即打印的IP地址是不固定的&#xff0c;随着每次开机或关机会变化&#xff0c;从而经常有人反应打印机不能打印或者扫描了。。总体思路1. 检查当前的IP设置2. 把相应的…

springboot2.5.5配置mybatis

【README】 1.本文记录了 springboot2.5.5 配置 mybatis的步骤&#xff1b; 2.配置mybatis 分为注解和配置两种方式&#xff1b; 3.引入mybatis&#xff0c;包括了 创建springbt项目&#xff1b;druid数据源配置&#xff1b;数据库表与javabean&#xff1b;mybatis配置与sq…

Java命令学习系列(三)——Jmap

转载自 Java命令学习系列&#xff08;三&#xff09;——Jmapjmap是JDK自带的工具软件&#xff0c;主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。可以使用jmap生成Heap Dump。在Java命令学习系列&#xff08;零&#xff09;——常见命…

skimage直方图如何保存_LightGBM的参数详解以及如何调优

lightGBM可以用来解决大多数表格数据问题的算法。有很多很棒的功能&#xff0c;并且在kaggle这种该数据比赛中会经常使用。但我一直对了解哪些参数对性能的影响最大以及我应该如何调优lightGBM参数以最大限度地利用它很感兴趣。我想我应该做一些研究&#xff0c;了解更多关于li…

基于springboot2.5.5自建启动器starter制品库

【README】 本文po出了自建springboot 启动器步骤&#xff1b; 【1】新建2个starter相关组件 根据 mybatis-spring-boot-starter&#xff0c;我们看到 自建starter需要两个组件&#xff0c;分别是 xxx-spring-boot-starter&#xff0c; xxx-spring-boot-starter-autoconfigu…

Java命令学习系列(二)——Jstack

转载自 Java命令学习系列&#xff08;二&#xff09;——Jstackjstack是java虚拟机自带的一种堆栈跟踪工具。功能 jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合&#xff0c;生成线程快照的主要目的是定位线程出…

python中ls是什么_使用Python代码实现Linux中的ls遍历目录命令的实例代码

一、写在前面 前几天在微信上看到这样一篇文章&#xff0c;链接为&#xff1a;https://www.jb51.net/it/692145.html&#xff0c;在这篇文章中&#xff0c;有这样一段话&#xff0c;吸引了我的注意&#xff1a;在 Linux 中 ls 是一个使用频率非常高的命令了&#xff0c;可选的参…

spring中stereotype注解Component,Repository,Service,Controller

【README】 本文介绍了 spring4.0 下 org.springframework.stereotype 的注解类型&#xff0c;俗称刻板型注解&#xff08;一成不变型&#xff09;&#xff1b; 包括 Component&#xff0c; Repository&#xff0c;Service&#xff0c; Controller &#xff1b; 目录 【REA…

[中级]Java命令学习系列(五)——jhat

转载自 [中级]Java命令学习系列&#xff08;五&#xff09;——jhatjhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。之前的文章讲到过&#xff0c;使用jmap可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令&#xff0c;将dump文件转成html的形式…

转:IDEA 创建类注释模板和方法注释模板

转自&#xff1a; IDEA 创建类注释模板和方法注释模板 - 简书  在使用Idea的时候&#xff0c;它的注释模板很简单&#xff0c;不够详细&#xff1b;所有大多数开发者都想设置一个比较详细的注释模板&#xff0c;我现在把我了解的创建类注释模板和方法注释模板的操作记录下来…

mappedbytebuffer_Java NIO Buffer【MappedByteBuffer】概述与FileChannel的联系

“ NIO【Non-blocking IO非阻塞式IO】&#xff0c;可以让你非阻塞的使用IO&#xff0c;例如&#xff1a;当线程从通道读取数据到缓冲区时&#xff0c;线程还是可以进行其他事情。当数据被写入到缓冲区时&#xff0c;线程可以继续处理它。从缓冲区写入通道也类似&#xff0c;主要…