跳到主要内容

vpp使用说明文档

先将vpp_arm64.tar.gz复制到目标机器上进行解压,解压后的目录结构如下:

root@localhost-Technical-B:~/vpp/vpp# ls
bin dpaa2 vpp_readme include install.sh kmod lib share startup.conf usertools vpp_papi-1.6.2-py2.7.egg

首先阅读vpp_readme,可根据该文档进行安装。

安装时需要运行install.sh脚本,该脚本主要把该目录下的文件拷贝到目的安装路径,并设置环境变量。使用如下命令进行安装:

chmod +x install.sh
./install.sh /mnt/

环境准备

绑定dpdk网口

dynamic_dpl.sh dpmac.4
export DPRC=dprc.2

驱动模块加载

  • 若需要开启kni功能,则需要加载rte_kni.ko模块,使用如下命令加载:

    insmod rte_kni.ko carrier=on

    需要注意的是carrier=on在dpdk18.05版本后不能省略,因为dpdk18.05版本后carrier默认为off。

  • 若不需要开启kni功能,则需要确保rte_kni.ko模块已经被卸载

    使用如下命令查看rte_kni.ko是否存在

    lsmod | grep rte_kni

    若存在则使用如下命令进行卸载:

    rmmod rte_kni

vpp配置文件

vpp配置文件与vpp配置一致,可直接参考vpp startup.conf相关配置(包括kni)。

  • 线程参数

    cpu {
    main-core 4
    corelist-workers 5
    }

    一般使用一个main线程和一个worker线程。

  • dpdk参数

    dpdk {
    ## Change default settings for all intefaces
    huge-dir /mnt/hugepages
    no-pci
    num-mem-channels 1
    # kni count
    #kni 1
    dev default {
    ## Number of receive queues, enables RSS
    ## Default is 1
    num-rx-queues 1
    num-rx-desc 40960
    #num-rx-desc 65536
    rss { ipv4 }

    ## Number of transmit queues, Default is equal
    ## to number of worker threads or 1 if no workers treads
    num-tx-queues 1
    }
    proc-type primary
    log-level 7
    }

    其中需要特别留意的是num-rx-desc,该值是dpdk的环形收包缓冲区大小,若设置过小会导致dpdk丢包。按当前测试结果来看40960为最优值,若大流量时出现大量rx-errors可适当增大该值。

    另外若需要启用kni功能,直接在dpdk配置中添加

    kni count

    即可,其中count是要支持kni的网口个数。kni网口个数依赖于实际的物理网口个数,kni个数无法超过实际物理网口个数。即kni是与物理网口一一对应的。

  • 插件参数

    plugins {
    ## Adjusting the plugin path depending on where the VPP plugins are
    path /path/lib/vpp_plugins
    vat-path /path/lib/vpp_api_test_plugins

    plugin default { enable }
    plugin gtpu_plugin.so { disable }
    }

    插件配置中需指明vpp_plugins的路径,另外需将原生的gtpu插件禁用。

kni配置和使用

  • 配置

    当启用kni功能时,对于一个物理网口来说,除vpp本身进行数据包处理外,还会在操作系统中虚拟出一个网口,一般命名为vEth0,其中0跟随kni个数增加。

    对于虚拟出来的网口可使用linux下的ifconfig、ethtool工具对其进行配置。可以将其当作正常的物理网口来使用。

  • 查看

    查看kni统计信息,可直接使用vppctl工具。

    vpp# show int
    Name Idx State MTU (L3/IP4/IP6/MPLS) Counter Count
    TenGigabitEthernet0 1 up 1500/0/0/0
    local0 0 down 0/0/0/0
    ----------------------------------------------------------------------------------------------------
    vEth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9216
    inet 121.168.1.12 netmask 255.255.255.0 broadcast 121.168.1.255
    inet6 fe80::b0c4:a3ff:feba:2ddf prefixlen 64 scopeid 0x20<link>
    ether b2:c4:a3:ba:2d:df txqueuelen 1000 (Ethernet)
    RX packets 8 bytes 708 (708.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 16 bytes 1364 (1.3 KB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    vpp# show int addr
    TenGigabitEthernet0 (up):
    L3 192.168.8.25/16
    local0 (dn):
    ----------------------------------------------------------------------------------------------------
    vEth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9216
    inet 121.168.1.12 netmask 255.255.255.0 broadcast 121.168.1.255
    inet6 fe80::b0c4:a3ff:feba:2ddf prefixlen 64 scopeid 0x20<link>
    ether b2:c4:a3:ba:2d:df txqueuelen 1000 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 10 bytes 796 (796.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
  • 分流

    分流是指需要决定一个报文是该送往kni经内核协议栈处理,还是该送往vpp由用户态协议栈处理。当前默认分流原则为GTPU报文送往用户态协议栈,非GTPU报文送往内核协议栈。因当前无其他分流策略,暂时不支持分流策略配置,均采用默认分流策略。

需要特别注意的是,当前kni和vpp可以配置相同的ip,也可以配置不同的ip。但kni和vpp的网口物理地址必须相同。