鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

使能DPDK和OVS

使能DPDK和OVS的步骤,包括启动OVS、配置DPDK参数并绑定轮询CPU、加载用户态驱动、创建基于DPDK的OVS Bridge以及在虚拟机XML配置中开启共享内存和添加DPDK网络接口。

  1. 启动OVS。
    mkdir -p /var/log/openvswitch/
    mkdir /var/run/openvswitch/
    ovsdb-tool create /etc/openvswitch/conf.db
    service openvswitch restart
  2. 配置DPDK并绑定轮询CPU。
    ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true other_config:dpdk-socket-mem="4096,4096,4096,4096" other_config:dpdk-lcore-mask="0xf8"  other_config:pmd-cpu-mask="0xf0"
    service openvswitch restart
    • “dpdk-socket-mem”参数用于配置针对4个NUMA节点的内存分配,如果机型NUMA数不等于4,请根据实际情况修改。
    • “dpdk-lcore-mask”“pmd-cpu-mask”则分别代表CPU的掩码。例如,如果希望将CPU 4到7绑定到特定任务上,那么对应的“pmd-cpu-mask”二进制表示就是“11110000”(从右至左数第5到8位为1,CPU编号从0开始),而“dpdk-lcore-mask”则比“pmd-cpu-mask”多一位,其二进制表示为“11111000”。将这两个二进制数转换为十进制后再转为十六进制,得到“0xf8”“0xf0”。可以使用Python快速地进行这样的转换,例如通过print(hex(int('11110000', 2)))
    • 建议将网卡绑定到其所在NUMA节点的CPU核上。
      1. 查看网口名称。
        ip a
      2. 查询网卡所在的NUMA节点。请将“网口名称”替换为实际的网口名称。
        cat /sys/class/net/网口名称/device/numa_node
  3. 加载用户态驱动。
    modprobe vfio
    modprobe vfio-pci
  4. 创建基于DPDK的OVS Bridge。
    1. 创建Bridge。
      ovs-vsctl add-br br-int -- set bridge br-int datapath_type=netdev
      ovs-vsctl add-port br-int p-tap-dpdk -- set Interface p-tap-dpdk type=patch options:peer=p-tap-dpdk-int
    2. 创建用户态TAP口。
      ovs-vsctl add-br br-ply$i -- set bridge br-ply$i datapath_type=netdev
      ovs-vsctl add-port br-ply$i tap$i -- set Interface tap$i type=dpdkvhostuser
      ovs-vsctl add-port br-ply$i p-tap$i-int -- set Interface p-tap$i-int type=patch options:peer=p-tap$i
      ovs-vsctl add-port br-int p-tap$i -- set Interface p-tap$i type=patch options:peer=p-tap$i-int

      其中,需要将命令中的$i替换为TAP口序号。如果需要创建多个TAP口,需要修改$i后重新执行上述命令。

    3. 绑定网卡设备。
      ovs-vsctl add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev
      ovs-vsctl add-port br-dpdk p0 -- set Interface p0 type=dpdk options:dpdk-devargs=0000:9b:00.0 options:n_rxq=10
      ovs-vsctl add-port br-dpdk p-tap-dpdk-int -- set Interface p-tap-dpdk-int type=patch options:peer=p-tap-dpdk

      0000:9b:00.0为对应PF(Physical Function)网口的设备ID,请根据实际情况修改。

    4. 查看OVS状态。
      ovs-vsctl show
  5. 配置虚拟机XML。
    1. 在虚拟机的XML配置中,开启共享内存,找到以下这段配置,并添加如下字段。
      memAccess='shared'

      添加完成后,如下所示。

      1
      2
      3
      4
      5
      6
        <cpu mode='host-passthrough' check='none'>
          <topology sockets='1' dies='1' clusters='1' cores='4' threads='1'/>
          <numa>
            <cell id='0' cpus='0-3' memory='16777216' unit='KiB' memAccess='shared'/>
          </numa>
        </cpu>
      
    2. 添加DPDK网络。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      <interface type='vhostuser'>
      <mac address='52:54:00:62:9a:43'/>
      <source type='unix' path='/var/run/openvswitch/tap1' mode='client'>
      <reconnect enabled='yes' timeout='10'/>
      </source>
      <target dev='tap1'/>
      <model type='virtio'/>
      <driver name='vhost' queues='8' rx_queue_size='1024' tx_queue_size='1024'/>
      </interface>
      

      “tap1”为虚拟机内部的网络接口名称,在4中创建,请根据实际情况修改。

      查询实际TAP口。
      ls /var/run/openvswitch/