OVS+DPDK

2023-05-16

DPDK简介

DPDK是X86平台报文快速处理的库和驱动的集合,不是网络协议栈,不提供二层,三层转发功能,不具备防火墙ACL功能,但通过DPDK可以轻松的开发出上述功能。

DPDK的优势在于,可以将用户态的数据,不经过内核直接转发到网卡,实现加速目的。主要架构如图所示:

这里写图片描述

传统的socket方式与DPDK对比:

这里写图片描述

DPDK关键技术点:

  1. 使用大页缓存支持来提高内存访问效率。
  2. 利用UIO支持,提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间 的,减小了报文在用户空间和应用空间的多次拷贝。
  3. 利用LINUX亲和性支持,把控制面线程及各个数据面线程绑定到不同的CPU核,节省了线程在各个CPU核来回调度。
  4. LOCKLESS, 提供无锁环形缓存管理,加快内存访问效率。
  5. 收发包批处理 ,多个收发包集中到一个cache line,在内存池中实现,无需反复申请和释放。
  6. PMD驱动,用户态轮询驱动,可以减小上下文切换开销,方便实现虚拟机和主机零拷贝。

OVS+DPDK

OpenvSwitch 以其丰富的功能,作为多层虚拟交换机,已经广泛应用于云环境中。Open vSwitch的主要功能是为物理机上的VM提供二层网络接入,和云环境中的其它物理交换机并行工作在Layer 2。

传统host ovs工作在内核态,与guest virtio的数据传输需要多次内核态和用户态的数据切换, 带来性能瓶颈.

Ovs+Dpdk和Ovs本身之间的区别可以由下图简单来表示:

这里写图片描述

在早期OVS的版本中,为缓解多级流表查表慢的问题,OVS在内核态采用Microflow Cache方法。Microflow Cache是基于Hash的精确匹配查表(O(1)),表项缓存了多级查表的结果,维护的是每条链接粒度的状态。Microflow Cache减少了报文进用户态查多级表的次数。一条流的首报文进入用户态查表后,后续的报文都会命中内核中的Microflow Cache,加快了查表速度。但是对于大量短流的网络环境来说,Microflow Cache命中率很低,导致大部分报文仍然需要到用户态进行多级流表查找,因此转发性能提升有限。

而后,为了解决Mircoflow Cache存在的问题,OVS采用Megaflow Cache代替了Mircoflow Cache。与Mircoflow Cache的精确Hash查表不同,Megaflow Cache支持带通配的查表,所以可减少报文至用户空间查表的次数。庾志辉的博客中当时分析的就是关于megaflow的数据结构和查表流程,相关内容不在此赘述,请看上文中的链接。但是,由于OVS采用元组空间搜索(下文介绍)实现Megaflow Cache的查找,所以平均查表次数为元组表的数量的一半。假设元组空间搜索的元组表链为m,那么平均查表开销为O(m/2)。Mircoflow Cache和Megaflow Cache查表开销对比为O(1)< O(m/2)。因此,Megaflow Cache相比于Mircoflow Cache,尽管减少了报文进用户空间查表的次数,但是增加了报文在内核态查表的次数。

为此,OVS当前版本采用Megaflow Cache+Microflow Cache的流Cache组织形式,仍保留了Microflow Cache作为一级Cache,即报文进入后首先查这一级Cache。只不过这个Microflow Cache含义与原来的Microflow Cache不同。原来的Microflow Cache是一个实际存在的精确Hash表,但是最新版本中的Microflow Cache不是一个表,而是一个索引值,指向的是最近一次查Megaflow Cache表项。那么报文的首次查表就不需要进行线性地链式搜索,可直接对应到其中一张Megaflow的元组表。这三个阶段的查表开销如表所示。

这里写图片描述

DPDK 高性能(user space) 网卡驱动、大页内存、无锁化结构设计,可以轻易实现万兆网卡线速的性能。ovs-dpdk使vm到vm和nic到vm的整个数据传输都工作在用户态,极大的提升了ovs的性能。

另外,ovs-dpdk 结合了DPDK和vhost-user技术的优势。vhost-user是一个用户态的vhost-backend程序,从虚拟机到host上实现了数据零拷贝(zero copy)。

原生ovs与ovs-dpdk比较

(1)原生ovs数据流处理过程如下:

这里写图片描述

  1. 数据包到达网卡后,上传给Datapath;
  2. Datapath 会检查缓存中的精确流表是否可以直接转发这个包,如果在缓存中没有找到记录,内核通过netlink发送一个upcall给用户空间的vswitchd;
  3. vswitchd检查数据库以查看数据包的目的端口在哪里。这里要操作openflow流表,需要和ovsdb以及ovs-ofctl交互;
  4. 刷新内核态流表内容;
  5. Reinject给datapath,重发数据包;
  6. 再次查询流表,获取数据包精确转发规则后,按规则转发

(2)ovs-dpdk方式:

这里写图片描述

用户态进程直接接管网卡收发数据,采用“IO独占核”技术,即每个端口分配一个核专门用于数据收发,轮询式处理方式代替中断式处理,显著提高IO性能。

总结:

比较原生ovsovs-dpdk
host收发包通过host的linux内核访问网卡通过dpdk高速数据通道收发包
内部交换在内核态datapath进行交换基于ovs,提供dpdk datapath的交换能力
vm后端驱动使用vni,基于开源tap进行优化vhost-user
vm前端驱动标准virtio设备标准virtio设备
交换路径2个线程:物理网卡(中断机制)->转发线程->放到tap设备队列->vhost_net取包送给vcpu1个线程:物理网卡(DPDK DPM)->转发线程->送给vcpu

使用ovs-dpdk

这里写图片描述

硬件要求

网卡得支持DPDK,见:http://dpdk.org/doc/nics
CPU得支持DPDK, 测试命令:cat /proc/cpuinfo |grep pdpe1gb
不一定非要支持DPDK硬件的网卡,因为DPDK也支持virtio dpdk driver.

这里写图片描述

打开大页支持

hua@node1:~$ cat  /etc/default/grub |grep GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci=assign-busses"
GRUB_CMDLINE_LINUX="transparent_hugepage=never hugepagesz=2M hugepages=64 default_hugepagesz=2M"

hua@node1:~$ mkdir /mnt/huge
hua@node1:~$ mount -t hugetlbfs nodev /mnt/huge
hua@node1:~$ echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
hua@node1:~$ cat /proc/meminfo |grep HugePages_
HugePages_Total:       8192
HugePages_Free:        8192
HugePages_Rsvd:        0
HugePages_Surp:        0
hua@node1:~$ grep Hugepagesize /proc/meminfo
Hugepagesize:       2048 kB

配置网卡使用uio_pci_generic驱动, 虚机可以使用PF去做DPDK port,也可以直通方式使用VF:

这里写图片描述

至于PF的驱动,可以使用ixgbe,也可以使用DPDK PF driver;对于VF的驱动,可以使用ixgbefv,也可以使用DPDK VF driver. 如果要使用DPDK PF driver需在grub中加上iommu=pt.

如下方式也可以通信:

这里写图片描述

测试场景搭建

sudo ovs-vsctl ovsbr0 br-int
sudo ovs-vsctl set bridge ovsbr0 datapath_type=netdev
sudo ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk  #Port name shoud begin with dpdk

# 给虚机创建普通ovs port:
sudo ovs-vsctl add-port ovsbr0 intP1 -- set Interface intP1 type=internal
sudo ip addr add 192.168.10.129/24 dev intP1
sudo ip link set dev intP1 up
sudo tcpdump -i intP1​

# 或给虚机创建vhost-user port:
sudo ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser

# 虚机使用vhost-user port
sudo qemu-system-x86_64 -enable-kvm -m 128 -smp 2 \
    -chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1 \
    -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
    -device virtio-net-pci,netdev=mynet1,mac=52:54:00:02:d9:01 \
    -object memory-backend-file,id=mem,size=128M,mem-path=/mnt/huge,share=on \
    -numa node,memdev=mem -mem-prealloc \
    -net user,hostfwd=tcp::10021-:22 -net nic \
    /bak/images/openstack_demo.img

# Inside VM: 
sudo ifconfig eth0 192.168.9.108/24

使用vhost-user方式示意图如下:

这里写图片描述

dpdk-virtio-net

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OVS+DPDK 的相关文章

  • Proxmox VE 超融合集群OVS(Open vSwitch)虚拟机网络隔离

    作者 xff1a 田逸 需求的产生 在一个高配置的Proxmox VE 超融合集群中 xff0c 为充分利用资源 xff0c 需要按某种需求将虚拟机之间进行网络隔离 xff0c 以支持更大规模的场景 网络虚拟化基本条件 支持VLAN的网络交
  • Neutron之OVS

    OVS即开放虚拟交换标准 xff0c 不仅仅是为了支持OpenFlow协议 xff0c 而是为了给虚拟化平台上运行的虚拟机实例提供一套纯软件实现的路由交换协议栈 具体点说 xff0c Open vSwitch是在开源的Apache2 0许可
  • openstack ovs-vswitch收包流程

    数据包从物理网卡进入虚拟机的流程 物理网卡处理 NIC 收到数据包 xff0c 会先将高低电信号转换到网卡 FIFO 存储器 NIC 首先申请 Ring buffer 的描述 xff0c 根据描述找到具体的物理地址 xff0c NIC 会使
  • OVS 使用总结

    1 简介 Open vSwitch 是一个用C语言开发的多层虚拟交换机 1 1 工作原理 内核模块实现了多个 数据路径 xff08 类似网桥 xff09 每个都可以有多个 vports xff08 类似网桥的端口 xff09 每个数据路径也
  • 关于ovs中ovs-ofctl add-flow的“in_port”问题

    问题提出 在之前做的docker容器互联的实验中有这样一句命令 xff1a ovs ofctl add flow s1 span class token string 34 in port 61 1 actions 61 drop 34 s
  • Neutron OVS Bridge 连接方式 (veth pair / ovs peer) 的选型和性能测试

    概述 Neutron 的桥的连接从Juno开始使用了ovs peer代替veth pair作为默认的网桥连接方式 xff0c 并宣称有性能方面的提升 xff08 commit xff09 同时在配置文件 xff08 etc neutron
  • OpenStack(Kilo) + Tenant-OVS-VXLAN(ml2) + Multi-Ext-Net

    from http blog sina com cn s blog 6de3aa8a0102vl7m html 使用VirualBox创建CentOS7虚拟机 资源分配视宿主windows而定 xff0c 由于要部署OpenStack xf
  • OVS和OVN 2.8新功能

    OVS和OVN 2 8新功能 本文最初整理在我的github上SDN Learning notes 本文翻译自ovs官方文档 本文档主要是关于2017年8月底发布的Open vSwitch 2 8中添加的内容 xff0c 重点介绍OVN中的
  • OVS+DPDK

    DPDK简介 DPDK是X86平台报文快速处理的库和驱动的集合 xff0c 不是网络协议栈 xff0c 不提供二层 xff0c 三层转发功能 xff0c 不具备防火墙ACL功能 xff0c 但通过DPDK可以轻松的开发出上述功能 DPDK的
  • 虚拟机支持本地nvme ssd

    提起存储都是血泪史 不知道丢了多少数据 脑子首先想到的就是 你说啥 洗脑神曲 我就像那个大妈一样 千万个问号 hdd是啥 ssd又是啥 mbr是啥 gpt又是啥 primary partion是啥 logical partion又是啥 sa
  • 万亿级KV存储架构与实践

    一 KV 存储发展历程 我们第一代的分布式 KV 存储如下图左侧的架构所示 相信很多公司都经历过这个阶段 在客户端内做一致性哈希 在后端部署很多的 Memcached 实例 这样就实现了最基本的 KV 存储分布式设计 但这样的设计存在很明显
  • KVM虚拟机热扩容

    创建一个虚拟机用于练习在线扩容 virt install name centos8 3 memory 4096 currentMemory 1024 vcpus 2 maxvcpus 8 disk var lib libvirt image
  • dpvs入门实践1--概念及编译安装

    DPVS是一种基于DPDK的高性能四层负载均衡器 它来源于Linux Virtual Server LVS及其修改后的alibaba LVS 那LVS是什么呢 Linux Virtual Server是构建在实服务器集群上的高度可伸缩和高可
  • Ubuntu下如何关闭指定端口的进程

    1 查看该端口的占用情况 lsof i 端口号 2 关闭进程 kill PID 可能不止一个进程
  • docker安装和基本操作

    简介 docker的三个基本概念 镜像 Image Docker 镜像可以看作是一个特殊的文件系统 除了提供容器运行时所需的程序 库 资源 配置等文件外 还包含了一些为运行时准备的一些配置参数 如匿名卷 环境变量 用户等 容器 Contai
  • Linux系统中如何查看TCP连接数

    这篇文章主要为大家展示了 Linux系统中如何查看TCP连接数 内容简而易懂 条理清晰 希望能够帮助大家解决疑惑 下面让小编带领大家一起研究并学习一下 Linux系统中如何查看TCP连接数 这篇文章吧 一 查看哪些IP连接本机 netsta
  • trex-bird使用过程解析

    trex bird原理 TRex Bird架构图 trex 结合bird服务是采用linux上的veth及网络命名空间的技术 bird运行在trex a bird ns 网络namespace里 创建veth虚接口对bird 0 0 T和b
  • ARP协议

    一 ARP概述 如果要在TCP IP协议栈中选择一个 最不安全的协议 那我会毫不犹豫把票投给ARP协议 我们经常听到的这些术语 包括 网络扫描 内网渗透 中间人拦截 局域网流控 流量欺骗 基本都跟ARP脱不了干系 大量的安全工具 例如大名鼎
  • DPDK+Pktgen 高速发包测试

    Pktgen概述 Pktgen Packet Gen erator 是一个基于DPDK的软件框架 发包速率可达线速 提供运行时管理 端口实时测量 可以控制 UDP TCP ARP ICMP GRE MPLS and Queue in Que
  • DPDK pdump 无法热插拔添加设备

    我正在尝试使用 dpdk pdump 从 dpdk 控制下的 NIC 捕获 tx 数据包 Setup DPDK 18 11 4 In config common base CONFIG RTE LIBRTE PMD PCAP y and C

随机推荐

  • opencv运行出现错误ffmpeg

    调试opencv程序 xff0c 运行时出现 xff1a Error opening file build opencv modules videoio src cap ffmpeg impl hpp 578 网络查询 xff0c 原因 x
  • 美团2014校招笔试题第二题答案分析

    今天在论坛里看到一网友贴出的美团2014校招笔试题 xff0c 其中第二题个人觉得答案应该为7次 xff0c 这里做了一个分析 xff0c 欢迎大家指出其中的纰漏 题目 xff1a 有25匹马 xff0c 每次比赛只能有5匹马参加 xff0
  • ssh连接不上

    之前执行ssh ip命令一直ok 最近换环境了 xff0c 执行ssh ip命令 xff0c 登录不了 xff0c 卡住 man一下 xff0c 知道有个 v的用法 xff1a v Verbose mode Causes ssh to pr
  • 怎么把ubuntu系统从英文修改为中文界面

    Ubuntu系统默认安装的语言是英文 xff0c 有些小伙伴使用起来可能觉得不是很方便 xff0c ubuntu是支持中文界面的 xff0c 修改方法也很简单 xff0c 下面就来看看详细的操作 1 更改语言之前首先确保你的虚拟机能够上网
  • 浅谈一次函数的斜率

    以下是一次函数的基本形式 请证明 本函数的斜率为 我们先来看斜率 我们就以函数为例 这个函数的图像是个直线 是吗 没错 所以如何求一个函数的斜率 设高为 底为 所以斜率就是 看到这个式子是不是感到和微分有关系 没错 微分的定义就是求切线函数
  • 华为 5680 OLT native vlan配置方式

    分为两部分 xff1a 1 配置给ONU端口 2 配置给OLT端口 1 在ONU 端口生效 ont port native vlan profile mode 命令功能 此命令用于配置ONT端口的缺省VLAN 当ONT的Native VLA
  • taskset 设置进程的CPU亲和性

    命令行形式 taskset options mask command arg taskset options p mask pid PARAMETER mask cpu亲和性 当没有 c选项时 其值前无论有没有0x标记都是16进制的 当有
  • 关于win7安装nvm和npm遇到的坑

    nvm到官网 xff08 https github com coreybutler nvm windows releases xff09 下载后 xff0c 直接安装 xff0c 可选择安装路径和nodejs的路径 安装完nvm后win7系
  • Highcharts的学习

    简介 xff1a Highcharts 是一个用纯 JavaScript 编写的一个图表库 xff0c 能够很简单便捷的在 Web 网站或是 Web 应用程序添加有交互性的图表 xff0c 并且 免费 提供给个人学习 个人网站和非商业用途使
  • 侠客精神 与 程序员的梦想

    侠客精神 与 程序员的梦想 我高考的那年是2013年 xff0c 也就是说你们高考完 xff0c 我也快要毕业了 促使我写这篇文章不单单是CSDN的 款款相待 xff0c 也是打算对自己的大学生活做一总结和对未来的人生做一规划 先说高考 x
  • 人脸识别之SphereFace

    2017的一篇cvpr xff0c SphereFace Deep Hypersphere Embedding for Face Recognition xff0c 继centerloss之后又一大作 文章主要提出了归一化权值 xff08
  • LovaszSoftmax

    论文 The Lovasz Softmax loss A tractable surrogate for the optimization of the intersection over union measure in neural n
  • ROS::ubuntu18.04 sudo: rosdep:找不到命令

    ubuntu18 04按照wiki上安装步骤执行sudo rosdep init是出现 sudo rosdep xff1a 找不到命令 原因 xff1a python rosdep这个包没有装 解决办法 xff1a 安装python ros
  • LCD12864液晶显示屏工作原理是什么呢?

    LCD12864液晶显示屏应用的非常广泛 xff0c 比如美容仪 xff0c 温度计 xff0c 保温杯 xff0c 汽车仪表等行业领域 xff0c 本文重点是由深圳兴宇合电子技术人员为大家讲解LCD12864液晶显示屏工作原理 xff0c
  • FreeRTOS启动第一个任务和任务的切换实现过程

    FreeRTOS启动第一个任务和任务的切换实现过程 此篇文章主要参考了野火的 FreeRTOS内核实现与应用开发指南 xff0c 和其他博主的一些资料并加入了一些个人理解 xff0c 作为学习笔记 xff0c 在此感谢火哥和其他博主 xff
  • make 编译报错:internal compiler error: Segmentation fault

    编译过程中出现 xff1a compiler error Segmentation fault span class token comment 编译Kudu源码 span span class token comment https ku
  • CUDA对应的NVIDIA驱动版本对照表

    https blog csdn net zhw864680355 article details 90411288
  • 又一金融级应用落地!百度超级链联合百信银行落地百度收银台商户清算方案

    区块链在金融行业的科技化升级中扮演举足轻重的作用 基于区块链技术防篡改 可追溯等特性 xff0c 百度超级链联合百信银行将其首先落地于百度收银台商户清算业务中 早在2017年 xff0c 百度超级链在资产证券化等领域已经开展领先实践 xff
  • 教你简单快速地在Linux系统下安装 docker

    Docker是基于Go语言开发的 xff01 是开源项目 xff01 docker官网 xff1a Docker Accelerated Containerized Application Development 文档 xff1a Dock
  • OVS+DPDK

    DPDK简介 DPDK是X86平台报文快速处理的库和驱动的集合 xff0c 不是网络协议栈 xff0c 不提供二层 xff0c 三层转发功能 xff0c 不具备防火墙ACL功能 xff0c 但通过DPDK可以轻松的开发出上述功能 DPDK的