• OpenvSwitch系列之十一 ovs-dpdk


    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
    
  • 相关阅读:
    Java-----Excel转HTML
    UI_拖动View
    查找——图文翔解Treap(树堆)
    android 三级菜单 BaseExpandableListAdapter
    New Relic——手机应用app开发达人的福利立即就到啦!
    安卓 下载多线程带进度条
    大数据
    Android学习路线(六)为Android应用加入ActionBar
    JavaScript日期对象使用总结
    经典二叉树
  • 原文地址:https://www.cnblogs.com/goldsunshine/p/14260941.html
Copyright © 2020-2023  润新知