Open vSwitch系列之一 Open vSwitch诞生

Open vSwitch系列之二 安装指定版本ovs

Open vSwitch系列之三 ovs-vsctl命令使用

Open vSwitch系列之四 ovs-ofctl命令使用

Open vSwitch系列之五 网桥特性功能配置

Open vSwitch系列之六 vlan隔离

Open vSwitch系列之七 meter表限速

Open vSwitch系列之八 vxlan隧道

Open vSwitch系列之九 Group表

Open vSwitch系列之十 调用北向接口下发流表

OpenvSwitch系列之十一 ovs-dpdk

DPDK介绍

DPDK(Data Plane Development Kit):

是一组快速处理数据包的开发平台及接口。有intel主导开发,主要基于Linux系统,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。

DPDK的作用

在数据平面应用中为快速处理数据包提供一个简单而完善的架构。在理解此工具集之后,开发人员可以以此为基础进行新的原型设计处理大并发网络数据请求。

当前数据包的处理流程是这样:

数据包到达网卡,网卡发送中断通知CPU,CPU将数据包拷贝到内核空间中,应用程序从内核空间中拷贝数据到用户态空间,数据处理。

在这个过程中数据包处理耗时的操作有:

  1. 网卡每次收到数据都发送中断,打断cpu的工作。切换和恢复过程都耗时
  2. 网络数据包经过TCP/IP协议栈,达到真正的应用处理程序时走过很多的流程
  3. 应用程序拿到网络数据时需要经过内核空间到用户态空间的一次copy,增加耗时

dpdk解决问题办法:

  1. DPDK技术是重载网卡驱动,直接将数据传递给用户态的应用程序,避免了中间环节的经过TCP/IP协议栈,内核空间到用户空间的copy。
  2. 同时针对第一点网卡频繁的中断,应用程序可以使用轮询的方式获取网卡上的数据,避免中断造成的场景切换和恢复浪费的时间。

ovs-dpdk

普通ovs

ovs的架构图:

ovs处理流表的过程是:

1.ovs的datapath接收到从ovs连接的某个网络设备发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。

2.ovs在内核状态下查看流表结构(通过Hash),观察是否有缓存的信息可用于转发这个数据包。

3.内核不知道如何处置这个数据包会将其发送给用户态的ovs-vswitchd。

4.ovs-vswitchd进程接收到upcall后,将检查数据库以查询数据包的目的端口是哪里,然后告诉内核应该将数据包转发到哪个端口,例如eth0。

5.内核执行用户此前设置的动作。即内核将数据包转发给端口eth0,进而数据被发送出去。

ovs-dpdk

DPDK加速的OVS与原始OVS的区别在于,从OVS连接的某个网络端口接收到的报文不需要openvswitch.ko内核态的处理,报文通过DPDK PMD驱动直接到达用户态ovs-vswitchd里。

DPDK加速的OVS数据流转发的大致流程如下:

1.OVS的ovs-vswitchd接收到从OVS连接的某个网络端口发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。

2.OVS在用户态查看精确流表和模糊流表,如果命中,则直接转发。

3.如果还不命中,在SDN控制器接入的情况下,经过OpenFlow协议,通告给控制器,由控制器处理。

4.控制器下发新的流表,该数据包重新发起选路,匹配;报文转发,结束。

总结

主要区别在于流表的处理。普通ovs流表转发在内核态,而ovs-dpdk流表转发在用户态

ovs-dpdk 安装

安装环境



系统:ubuntu1604

网卡:intel I350



编译工具安装

apt-get update
apt install automake libtool build-essential openssl -y
apt install desktop-file-utils groff graphviz -y
apt install checkpolicy python-sphinx python-twisted-core -y

编译安装dpdk

wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.11.tar.gz
mkdir -p /usr/src/dpdk
解压并进入目录
make config T=x86_64-native-linuxapp-gcc
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/src/dpdk
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr

编译安装ovs

wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz

解压并进入目录

./boot.sh

./configure \
--with-dpdk=/usr/src/dpdk \
--prefix=/usr \
--exec-prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var make make install

网卡绑定

系统设置

vim  /boot/grub2/grub.cfg

找到引导的相应内核参数,在后面添加:iommu=pt intel_iommu=on

linux   /vmlinuz-4.4.0-142-generic root=/dev/mapper/ubuntu--vg-root ro recovery nomodeset  iommu=pt intel_iommu=on

重启生效

设置dpdk驱动

modprobe uio_pci_generic
dpdk-devbind --bind=uio_pci_generic enp1s0f0
dpdk-devbind --bind=uio_pci_generic enp1s0f1

配置大页

查看当前的hugepage

grep HugePages_ /proc/meminfo

修改hugepage的页数为1024

临时设置大页的方法,重启失效:

echo 1024 > /proc/sys/vm/nr_hugepages

配置保存的设置方法,重启生效:

echo 'vm.nr_hugepages=1024' > /etc/sysctl.d/hugepages.conf

挂载hugepages

mount -t hugetlbfs none /dev/hugepages

启动ovs进程

准备ovs相关路径

mkdir -p /etc/openvswitch
mkdir -p /var/run/openvswitch

删除旧的ovs配置数据和创建新的(可选)

如果不需要旧配置时,可以选择该操作

rm /etc/openvswitch/conf.db
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema

启动ovsdb server

ovsdb-server /etc/openvswitch/conf.db \
-vconsole:emer -vsyslog:err -vfile:info \
--remote=punix:/var/run/openvswitch/db.sock \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir \
--log-file=/var/log/openvswitch/ovsdb-server.log \
--pidfile=/var/run/openvswitch/ovsdb-server.pid \
--detach --monitor

第一次启动ovs需要初始化

ovs-vsctl --no-wait init

初始化dpdk

从ovs-v2.7.0开始,开启dpdk功能已不是vswitchd进程启动时指定–dpdk等参数了,而是通过设置ovsdb来开启dpdk功能

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true

自定义一些dpdk的参数(可选)

指定的sockets从hugepages预先分配的内存

ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"

指定在某些core上运行

ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x02

查看自定义的dpdk参数

ovs-vsctl get Open_vSwitch . other_config:dpdk-socket-mem
ovs-vsctl get Open_vSwitch . other_config:pmd-cpu-mask
ovs-vsctl get Open_vSwitch . other_config:dpdk-init

启动vswitchd进程

ovs-vswitchd unix:/var/run/openvswitch/db.sock \
-vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid \
--detach --monitor

ovs工具使用

创建openvswitch网桥

ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev

把dpdk端口加入网桥

先使用dpdk-devbind命令查看当前已绑定的dpdk网卡,并记住相应的PCI地址

dpdk-devbind --status

ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:01:00.0
ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.1

完成分割线

到这里就安装完成了,并且两台主机之间可以直接转发数据。

测速

在两主机之间使用iperf工具测速,服务端收集到的测速信息如下:

两主机之间是1000Mb的带宽

目前只使用了iperf的测速方法,发现ovs-dpdk和ovs的转发效率没有什么区别,可能并没有找到合适的测试方法,待补充。

报错解决

在安装过程中可能会出现的报错:

ovs-vsctl: unix:/usr/local/var/run/openvswitch/db.sock: database connection failed (No such file or directory)

解决方法:

ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
--pidfile --detach
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach
/usr/share/openvswitch/scripts/ovs-ctl start

OpenvSwitch系列之十一 ovs-dpdk的更多相关文章

  1. OVS + dpdk 安装与实验环境配置

    ***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装       0:安装必要的工具            make            gcc           ...

  2. ovs+dpdk numa感知特性验证

    0.介绍 本测试是为了验证这篇文章中提到的DPDK的NUMA感知特性. 简单来说,在ovs+dpdk+qemu的环境中,一个虚拟机牵涉到的内存共有三部分: DPDK为vHost User设备分配的De ...

  3. OpenvSwitch系列之八 vxlan隧道

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  4. OpenvSwitch系列之七 meter表限速

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  5. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. 【圣诞特献】Web 前端开发精华文章推荐【系列二十一】

    <Web 前端开发精华文章推荐>2013年第九期(总第二十一期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各种增强网站用户体验的 jQuery 插件,展示前沿的 HTML5 和  ...

  7. OVS+DPDK Datapath 包分类技术

    本文主体内容译于[DPDK社区文档],但并没有逐字翻译,在原文的基础上进行了一些调整,增加了对TSS分类器的详细阐述. 1. 概览 本文描述了OVS+DPDK中的包分类器(datapath class ...

  8. 译文:ovs+dpdk中的“vHost User NUMA感知”特性

    本文描述了"vHost User NUMA感知"的概念,该特性的测试表现,以及该特性为ovs+dpdk带来的性能提升.本文的目标受众是那些希望了解ovs+dpdk底层细节的人,如果 ...

  9. 单元测试系列之十一:Jmockit之mock特性详解

    本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...

  10. webpack4 系列教程(十一):字体文件处理

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十一):字体文件处理>原文地址.或者来我的小站看更多内容:godbmw.com 0. 课程介 ...

随机推荐

  1. 颠覆了!eShop跟随.Net 8迎来重磅升级,微服务架构与GPT的完美结合!

    .Net 8正式发布了,发布了诸多重大的新功能.新特性! .Net 8新增的功能带来诸多惊喜,还未一一体验完毕呢,我又发现了跟随.Net 8的发布,eShop也迎来重磅升级! eShop一直以来都是微 ...

  2. iOS性能优化之内存分析

    成功之前我们要做应该做的事情,成功之后我们才可以做喜欢做的事情.   从苹果的开发者文档里可以看到内存分类如下所示,其中 Leaked memory和 Abandoned memory 都属于应该释放 ...

  3. Windows之——pid为4的system进程占用80端口的解决办法

    因为Apache无法启动的原因,用netstat命令查看了一下80端口是否被占用了,如下 C:\Users\Maple>netstat -ano | findstr 0.0.0.0:80 TCP ...

  4. PLC 和Modbus/串口设备现场总线通信及短信报警解决方案

    在实现 Modbus 设备与 PROFIBUS DP 协议 PLC 通讯的同时可以在手机端实时的接收报警短信,使客户足不出户了解设备与 PLC 的状态,及时处理现场中的问题. 系统组成 Modbus ...

  5. 什么是cursor?怎么使用cursor?

    Cursor 在Android查询数据时就是通过Cursor类来实现的.当我们使用SQLiteDatabase.query()方法时,就会得到Cursor对象,Cursor所指向的就是每一条数据. 举 ...

  6. 【Javaweb】JavaEE项目的三层架构 | 快速搭建

    逻辑类图 分层的目的是为了解耦.解耦就是为了降低代码的耦合度.方便项目后期的维护和升级. 不同的层有不同的包 web层 com.stguigu.web/servlet/controller servi ...

  7. 如何用excel制作图表?

    Excel是一个非常强大的电子表格软件,其中包含了很多绘制图表的功能.下面是一些基本步骤,可以帮助你用Excel制作图表: 打开Excel并输入数据.在Excel中,首先需要输入需要制作图表的数据.可 ...

  8. 记一次 .NET 某零售管理系统 存储不足分析

    一:背景 1. 讲故事 前几天有位朋友找到我,说他的程序会偶发性的报 存储空间不足,无法处理此命令 的错误,让我帮忙看下到底怎么回事,哈哈,人家是有备而来,dump都准备好了,话不多说,直接分析开干. ...

  9. [2020-2021 集训队作业] Tom & Jerry

    题目背景 自选题 by ix35 题目描述 给定一张包含 \(n\) 个顶点和 \(m\) 条边的 无向连通图,Tom 和 Jerry 在图上进行了 \(q\) 次追逐游戏. 在第 \(i\) 次游戏 ...

  10. LeetCode227:基本计算器|| (栈、模拟)

    解题思路:两个双端队列模拟,一个存放操作数 a,另一个存放操作符 op,如果找到另一个操作数b,判断操作队列队尾是否是*/,是的话执行 a(*or/)b.遍历完字符串,如果操作符队列非空,说明还有+- ...