---
title: 使能DPDK和OVS
description: "使能DPDK和OVS的步骤，包括启动OVS、配置DPDK参数并绑定轮询CPU、加载用户态驱动、创建基于DPDK的OVS Bridge以及在虚拟机XML配置中开启共享内存和添加DPDK网络接口。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/systuningguide/systemtg/kunpengtypical_05_0010.html
sourcePath: /source/zh/kunpengcpfs/systuningguide/systemtg/kunpengtypical_05_0010.html
indexId: 44b1fed70528c6975d4508012d093f63beb6242b08ea941d7c57b51f60d0074174
---
# 使能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核上。 查看网口名称。 ip a 查询网卡所在的NUMA节点。请将“网口名称”替换为实际的网口名称。 cat /sys/class/net/网口名称/device/numa_node

3. 加载用户态驱动。

```
modprobe vfio
modprobe vfio-pci
```


4. 创建基于DPDK的OVS Bridge。

  a. 创建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
```


  b. 创建用户态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后重新执行上述命令。

  c. 绑定网卡设备。

```
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，请根据实际情况修改。

  d. 查看OVS状态。

```
ovs-vsctl show
```


5. 配置虚拟机XML。

  a. 在虚拟机的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>

  b. 添加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/
