DPDK 专题

发布时间: 更新时间: 总字数:2614 阅读时间:6m 作者: IP上海 分享 网址
专栏文章
  1. DPDK 初学者入门必读
  2. DPDK 源码安装
  3. Testpmd
  4. DPDK 常用术语

DPDK(Data Plane Development Kit) 是一种 SDN 数据平面开发工具包,它由一组用于快速包处理的库和驱动程序组成,用于加速在各种 CPU 架构上运行的包处理工作负载。DPDK 应用程序是运行在 Linux 用户空间,并利用自身提供的 数据平面库 来收发数据包,绕过了 Linux 内核协议栈对数据包处理过程。

相关网址

  • 官网:https://dpdk.org
  • 源代码:http://git.dpdk.org/
  • http://patches.dpdk.org/
  • bug:https://bugs.dpdk.org/
  • 使用源码编译DPDK

核心技术

DPDK 提高网络数据处理能力的技术包括:

  • 多核架构

  • huge page内存

  • PMD(poll-mode drivers)等库,此方案使用DPDK对OVS加速。

  • PMD(Poll Mode Driver),是基于用户态的轮询机制的驱动

  • EAL(Environment Abstraction Layer,环境抽象层)

  • igb_uio 是 DPDK kit 中拥有与 uio 交互,bind 指定网卡的内核模块

  • uio 模块,是内核提供的用户态驱动框架

  • CPU affinity

https://www.sdnlab.com/23551.html 环境抽象层(EAL)是DPDK的核心。它是DPDK的一个库。顾名思义,它负责抽象出环境(硬件、操作系统等)并为软件提供统一的接口。EAL要处理很多东西,所以也不难理解为何它会是DPDK中最复杂的一个部分。由EAL负责处理的包括:

· 管理CPU核心和非统一内存访问(NUMA)节点 · 将硬件设备的寄存器映射到内存中,使它们可受DPDK轮询模式驱动程序(PMDs)驱动 · 管理硬件和软件中断 · 抽象出平台差异,如字节序、缓存行大小等 · 管理内存和多进程同步 · 提供与原子、内存屏障和其他同步原语共通的独立于平台和操作系统的方法 · 加载和枚举硬件总线,设备和PMD

但是,用户不必非要在两者中选择一个。可以自动检测出最合适的IOVA模式,而且默认选项绝对适用于大多数情况,因此不需要用户来做此选择。如果默认选项并不合适,用户可以使用–iova-mode EAL命令行参数尝试使用EAL标志(适用于DPDK 17.11及更高版本)来代替IOVA模式:

1 ./app –iova-mode=pa # use IOVA as PA mode 2 ./app –iova-mode=va # use IOVA as VA mode

大多数情况下,VA和PA模式不会互相排斥,可以使用任一模式,但在某些情况下,作为PA模式的IOVA是唯一可用的选择。当不能使用作为VA模式的IOVA时,即使EAL参数要求使用作为VA模式的IOVA,DPDK也会自动切换为作为PA模式的IOVA。

Run the following command to confirm that DPDK is enabled:

$ sudo ovs-vsctl get Open_vSwitch . iface_types

[dpdk, dpdkr, dpdkvhostuser, dpdkvhostuserclient, geneve, gre, internal, lisp, patch, stt, system, tap, vxlan]

https://www.jianshu.com/p/fa7d9f2c0f55 [root@dpdk ~]# modprobe pktgen [root@dpdk ~]# lsmod |grep pktgen pktgen 49284 0 [root@dpdk ~]# modprobe vfio [root@dpdk ~]# lsmod |grep vfio vfio_iommu_type1 22440 0 vfio 32657 1 vfio_iommu_type1

modprobe \ lsmod \ insmod

[root@dpdk rpmbuild]# modprobe vfio-pci [root@dpdk rpmbuild]# lsmod |grep vfio vfio_pci 41993 0 vfio_iommu_type1 22440 0 vfio 32657 2 vfio_iommu_type1,vfio_pci irqbypass 13503 1 vfio_pci

cat /proc/net/pktgen/pgctrl

yum install dpdk

$ env |grep RTE
RTE_INCLUDE=/usr/include/dpdk
RTE_SDK=/usr/share/dpdk
RTE_TARGET=x86_64-default-linuxapp-gcc

安装 pktgen-dpdk-pktgen

lua 5.3 安装

yum install -y readline readline-devel ncurses ncurses-devel

wget https://www.lua.org/ftp/lua-5.3.6.tar.gz tar -zxvf lua-5.3.6.tar.gz cd lua-5.3.6/ make linux && make install

$ lua -v Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio

如果安装了 lua-devel,使用如下命令删除:

$ rpm -evh lua-devel

build

  • dpdk

Create the DPDK build tree:

[root@dpdk dpdk-stable-19.11.7]# ./usertools/dpdk-devbind.py -s

Network devices using kernel driver

0000:02:01.0 ‘82545EM Gigabit Ethernet Controller (Copper) 100f’ if=ens33 drv=e1000 unused=igb_uio,vfio-pci Active 0000:03:00.0 ‘VMXNET3 Ethernet Controller 07b0’ if=ens160 drv=vmxnet3 unused=igb_uio,vfio-pci

[root@dpdk dpdk-stable-19.11.7]# ./usertools/dpdk-devbind.py -b igb_uio 0000:03:00.0 [root@dpdk dpdk-stable-19.11.7]# ./usertools/dpdk-devbind.py -s

Network devices using DPDK-compatible driver

0000:03:00.0 ‘VMXNET3 Ethernet Controller 07b0’ drv=igb_uio unused=vmxnet3

Network devices using kernel driver

0000:02:01.0 ‘82545EM Gigabit Ethernet Controller (Copper) 100f’ if=ens33 drv=e1000 unused=igb_uio Active

  • pkt-gen

http://git.dpdk.org/apps/pktgen-dpdk/refs/

wget http://git.dpdk.org/apps/pktgen-dpdk/snapshot/pktgen-dpdk-pktgen-3.7.2.tar.gz tar -zxvf pktgen-dpdk-pktgen-3.7.2.tar.gz cd pktgen-dpdk-pktgen-3.7.2 yum install -y meson ninja-build cmake export RTE_SDK=/root/dpdk/dpdk-stable-19.11.7 export RTE_TARGET=x86_64-native-linux-gcc make

编译完成后在 app/x86_64-native-linux-gcc/app/ 查看编译包:

$ ll app/x86_64-native-linux-gcc/app/
total 20452
-rwxr-xr-x 1 root root 14603664 Apr 27 02:13 pktgen
-rw-r--r-- 1 root root  6336090 Apr 27 02:13 pktgen.map

修改 ./cfg/default.cfg

diff --git a/default.cfg b/default.cfg
index 6687739..fd543e1 100644
--- a/default.cfg
+++ b/default.cfg
@@ -7,10 +7,10 @@ setup = {
         ),

     'devices': (
-           '03:00.0', '05:00.0', '81:00.0', '84:00.0'
+           '03:00.0'
            ),
     # UIO module type, igb_uio, vfio-pci or uio_pci_generic
-    'uio': 'vfio-pci'
+    'uio': 'igb_uio'
     }

 # Run command and options
@@ -31,7 +31,7 @@ run = {
         './build/app/%(app_name)s',
         ),

-       'cores': '2,3-4,5-6,16-17,18-19',
+       'cores': '2,3',
        'nrank': '4',
        'proc': 'auto',
        'log': '7',
@@ -42,9 +42,7 @@ run = {
                #'81:00.0', '84:00.0'
                ),
        'whitelist': (
-               '05:00.0,safe-mode-support=1',
-               '84:00.0,safe-mode-support=1',
-               '03:00.0', '81:00.0'
+               '03:00.0'
                ),

        'opts': (
@@ -54,10 +52,7 @@ run = {
                '-j',
                ),
        'map': (
-               '[3:4].0',
-               '[5:6].1',
-               '[16:17].2',
-               '[18:19].3'
+               '1.0',
                ),

        'theme': 'themes/black-yellow.theme'
$ ./tools/run.py -s default
>>> sdk '/root/dpdk/dpdk-stable-19.11.7', target 'x86_64-native-linux-gcc'
Setup DPDK to run 'pktgen' application from cfg/default.cfg file
$ ./tools/pktgen-run.sh default  # 使用 default.cfg 运行
  • Running the application
$ cd ./app/x86_64-native-linux-gcc/app
$ ./pktgen -l 2-3 -n 2 -- -P -m "1.0"
Copyright (c) <2010-2019>, Intel Corporation. All rights reserved. Powered by DPDK
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:02:01.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:03:00.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 15ad:7b0 net_vmxnet3
Lua 5.3.6  Copyright (C) 1994-2020 Lua.org, PUC-Rio

*** Copyright (c) <2010-2019>, Intel Corporation. All rights reserved.
*** Pktgen created by: Keith Wiles -- >>> Powered by DPDK <<<

 Port: Name         IfIndex Alias        NUMA  PCI
    0: net_vmxnet3     0                   0   15ad:07b0/03:00.0

Initialize Port 0 -- TxQ 1, RxQ 1
Src MAC 00:50:56:29:1b:66
 <Promiscuous mode Enabled>


WARNING: Nothing to do on lcore 3: exiting
- Ports 0-0 of 1   <Main Page>  Copyright (c) <2010-2019>, Intel Corporation
  Flags:Port        : P------Single      :0
/ink State          :         <UP-10000-FD>      ---Total Rate---
Pkts/s Max/Rx       : P------Single      :0                   0/0
       Max/Tx       :         <UP-10000-FD>                   0/0
MBits/s Rx/Tx       :                   8/0                   8/0
Broadcast           :                   0/0                   0/0
Multicast           :                   0/0                   0/0
Sizes 64            :                     0
      65-127        :                     0
      128-255       :                     0
      256-511       :                     0
      512-1023      :                     0
      1024-1518     :                     0
Runts/Jumbos        :                     0
ARP/ICMP Pkts       :                     0
Errors Rx/Tx        :                   0/0
Total Rx Pkts       :                   0/0
      Tx Pkts       :                   0/0
      Rx MBs        :                    27
      Tx MBs        :                     0
                    :                     0
Pattern Type        :                     0
Tx Count/% Rate     :         Forever /100%
Pkt Size/Tx Burst   :             64 /   64
TTL/Port Src/Dest   :         4/ 1234/ 5678
Pkt Type:VLAN ID    :       IPv4 / TCP:0001
-- Pktgen 19.12.0 (D:     15ad:07b0/03:00.0y DPDK  (pid:15760) ----------------
** Version: DPDK 19.11.7, Command Line Interface without timers
Pktgen:/>
  • 启动参数配置说明

  • – 前面为 DPDK EAL 配置

    • -l 2-3 : lcores
    • -n 2 : Number of memory channels
  • – 后面为 pktgen app 配置

    • -P : 允许所有端口以混杂模式运行
    • -m “1.0” : port 与 lcores的绑定关系
pktgen -l 0-4 -n 3 --proc-type auto --socket-mem 256,256
             -b 0000:03:00.0 -b 0000:03:00.1 \
              --file-prefix pg \
             -- -P -m "[1:3].0, [2:4].1
  • 运行pktgen,发100个包
set 0 dst ip 192.168.74.132
set 0 dst mac 00:0c:29:45:e2:b9
set 0 count 100
start 0
  • 发1000包
set 0 count 1000
str  # start all

ethtools -i p2pi ethtools -K p2p1 hw-tc-offload on

ovs-vsctl set Interface dpdk0 options:rx-checksum-offload=true

ovs-vsctl set Interface dpdk0 options:dpdk-init=true ovs-vsctl set Interface dpdk0 options:dpdk-socket-mem=true ovs-vsctl set Interface dpdk0 options:pmd-cpu-mask=true ovs-vsctl set Interface dpdk0 options:userspace-tso-enable=true

devbind -u dpdk-devbind -b vfio-pci

ovs-vsctl del-port br_phy dpdk ovs-vsctl remove Open_ . other_config dpdk-init/cpu-mask-socket-mem userspace-tso-enable systemctl restart openvswitch ovs-vsctl add

devbind -s devbnd -u 44 devbind -b ixgbe 44 ethtool -i p2p1

devbind -b vfio-pic 44 start openvswitch ovs-vsctl set Open . other_config:dpk-init=true

ovs-vsctl addppoort br-phy dpdk0 – set Interface dpdk0 type=dpdk options:dpdk-devargs=“00:44” ethtool dde ovs-vsctl get Open_vSwtich . dpdk_version

/etc/sysconfig/openvswitch

当前问题

tunneling packets with HW offload flags is not support package drop

flat 网络 package dropped no tcp checksum support

1a:00.0 Ethernet controller: Intel Corporation Ethernet 10G 2P X520 Adapter (rev 01) 1a:00.1 Ethernet controller: Intel Corporation Ethernet 10G 2P X520 Adapter (rev 01)

在X86结构中,处理数据包的传统方式是CPU中断方式,既网卡驱动接收到数据包后通过中断通知CPU处理,然后由CPU拷贝数据并交给协议栈。在数据量大时,这种方式会产生大量CPU中断,导致CPU无法运行其他程序。而DPDK则采用轮询方式实现数据包处理过程:DPDK重载了网卡驱动,该驱动在收到数据包后不中断通知CPU,而是将数据包通过零拷贝技术存入内存,这时应用层程序就可以通过DPDK提供的接口,直接从内存读取数据包。这种处理方式节省了CPU中断时间、内存拷贝时间,并向应用层提供了简单易行且高效的数据包处理方式,使得网络应用的开发更加方便。但是DPDK需要网卡支持,目前以intel的网卡为主,想要知道您的网卡是否支持,可以到DPDK的官网查询:http://dpdk.org。

作者:cjzhao 链接:https://www.jianshu.com/p/072381425b3b 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

If you are not sure, check for a directory named /sys/class/misc/tun. If it does not exist, then attempt to load the module with modprobe tun

ovs-vswitchd will create a TAP device as the bridge’s local interface, named the same as the bridge, as well as for each configured internal interface.

DPDK的思路是,绕过操作系统内核,在用户空间,通过PMD(Poll Mode Driver)直接操作网卡的接收和发送队列

加载 vfio

[root@dpdk ~]# modprobe vfio-pci [root@dpdk ~]# lsmod |grep vfio vfio_pci 41993 0 vfio_iommu_type1 22440 0 vfio 32657 2 vfio_iommu_type1,vfio_pci irqbypass 13503 1 vfio_pci

[root@dpdk ~]# dpdk-devbind -b vfio-pci 0000:03:00.0 Error - no supported modules(DPDK driver) are loaded [root@dpdk ~]# [root@dpdk ~]# [root@dpdk ~]# modprobe vfio-pci [root@dpdk ~]# dpdk-devbind -b vfio-pci 0000:03:00.0 Routing table indicates that interface 0000:03:00.0 is active. Not modifying [root@dpdk ~]# dpdk-devbind -s

Network devices using kernel driver

0000:02:01.0 ‘82545EM Gigabit Ethernet Controller (Copper) 100f’ if=ens33 drv=e1000 unused=vfio-pci Active 0000:03:00.0 ‘VMXNET3 Ethernet Controller 07b0’ if=ens160 drv=vmxnet3 unused=vfio-pci Active

No ‘Crypto’ devices detected

No ‘Eventdev’ devices detected

No ‘Mempool’ devices detected

No ‘Compress’ devices detected

[root@dpdk ~]#

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数