总览
本文是“Arm上带DPDK的Open vSwitch”系列博客的第2章。本文描述了如何使用DPDK设置OvS从而在Arm平台上运行PHY-PHY流量测试。高级执行步骤列举如下:
•前提条件:隔离CPU
• 大页内存(Hugepage)配置
• DPDK设置
•使用 OvS的 DPDK配置 设置OvS
•PHY-PHY设置
本文假定您已经在Arm平台的主目录中构建并安装了带有DPDK的OvS。 Arm平台被用作流量测试的被测设备(DUT)。 如果您尚未完成这些步骤,请参阅本系列博客的第1章:构建与安装。
前提条件:隔离CPU
隔离CPU可以防止Linux调度程序将任务和进程分配给CPU。 是非常有用的方式。
一旦taskset命令,cset命令或其他利用CPU亲和性系统调用(syscall)的软件将进程和任务手动分配给这个CPU。
隔离CPU对流量测试很重要,因为这样可以使OvS占用尽可能多地执行时间。 如果您的Arm系统已经有隔离的内核,并且系统配置与以下类似,则可以跳过本环节,从“Hugepage配置”环节开始即可。
1. 使用lscpu命令检查系统上的CPU内核数。我的N1SDP平台输出如下:
$ lscpu | grep 'CPU.s'
CPU(s): 4
On-line CPU(s) list: 0-3
NUMA node0 CPU(s): 0-3
2. 将“ isolcpus”内核引导参数添加到/etc/default/grub 文件中的GRUB\_CMDLINE\_LINUX选项中。 我已经隔离了系统上的3个CPU内核,从CPU内核1到CPU内核
3. 最好将nohz\_full 和rcu\_nocbs 引导参数也添加到GRUB\_CMDLINE\_LINUX选项中进一步减少对CPU的干扰。 如果一个CPU在nohz\_full 参数下被列出,则内核将停止向这个CPU发送计时器滴答声,从而使CPU花费较少的时间来处理中断和上下文切换。使用 rcu\_nocbs 参数让CPU在“无RCU回调”模式下运行,即将回调转移给“housekeeping CPU”处理
GRUB_CMDLINE_LINUX="isolcpus=1-3 nohz_full=1-3 rcu_nocbs=1-3"
4. 运行update-grub 更新核配置。
$ sudo update-grub
5. Reboot你的系统。系统启动后,检查CPU内核是否已经被隔离。
$ cat /proc/cmdline | grep isolcpus
Hugepage配置
1. 您需要配置并分配hugepage才能成功用DPDK运行OvS。大多数Arm系统支持2MB或者1GB的hugepage大小。
使用sysctl命令进行2MB hugepage的运行时分配。
$ sudo sysctl -w vm.nr_hugepages=N where N is number of 2M pages
因为我们在运行时分配hugepage,hugepage的配置将不会在reboot后保留。您可以编辑
/etc/sysctl.d/hugepages.conf
文件使hugepage分配可以在reboot后永久保留。
如果您的系统支持1GB作为默认的hugepage大小,那么系统boot后将无法保留hugepage。您可以编辑/etc/default/grub 文件添加用于保留1GB hugepage的内核引导参数:
GRUB_CMDLINE_LINUX="default_hugepagesz=1G hugepagesz=1G hugepages=4"
在编辑完文件和reboot系统使更改生效后运行update-grub。您可以使用以下命令来验证hugepage的配置:
$ grep Huge /proc/meminfo
对于1GB的 hugepage,最好可以在系统第一次boot时或者在系统第一次boot后不久分配hugepage。这样可以防止物理内存碎片化,同时确保为hugepage分配连续的内存段。
2. 一旦分配好了hugepage,需检查hugepage是否已经被安装。如果看到以下输出,说明hugetlbfs已被安装而无需重装。
$ mount | grep hugetlbfs
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,mode=1770,gid=78)
如果hugepage没有被默认安装,用以下命令进行安装:
$ sudo mount -t hugetlbfs none /dev/hugepages
DPDK设置
1. 加载vfio-pci 内核模块。
$ sudo modprobe vfio-pci
2. 当我使用英特尔网络接口卡(NIC)时,我需要把接口(连在流量生成器)绑定到vfio 驱动。如果使用其他类型的NIC,可以跳过此步骤。 请检查NIC的制造商。 可以用以下第一个命令观察NIC的PCIe地址:
$ sudo $HOME/dpdk-19.11/usertools/dpdk-devbind.py --bind=vfio-pci <pci_address_1> <pci_address_2>
OvS设置
1. 终止任何现有的OvS守护进程和上次运行时生成的文件来清理OvS环境。
$ sudo killall ovsdb-server ovs-vswitchd
$ sudo rm -f $HOME/var/run/openvswitch/*
$ sudo rm -f $HOME/etc/openvswitch/conf.db
$ sudo rm -f $HOME/var/log/openvswitch/ovs-vswitchd.log
2. 创建OvS守护进程的目录。只需在首次设置PHY-PHY测试时执行此步骤。
$ mkdir -p $HOME/etc/openvswitch
$ mkdir -p $HOME/var/run/openvswitch
$ mkdir -p $HOME/var/log/openvswitch
3. 设置环境变量
$ export DPDK_DIR=$HOME/dpdk-19.11
$ export PATH=$HOME/usr/share/openvswitch/scripts:$PATH
4. 在启动ovs-vswitchd 之前,您需要启动它的数据库配置,ovsdb-server。在启动数据库之前,需要配置一个被ovsdb-server 使用的数据库。
$ cd $HOME/usr/bin
$ sudo ./ovsdb-tool create $HOME/etc/openvswitch/conf.db $HOME/usr/share/openvswitch/vswitch.ovsschema
5 配置ovsdb-server 来使用前一步所创建的数据库,以便侦听Unix域套接字,并连接到数据库中指定的任意管理器。
$ cd $HOME/usr/sbin
$ sudo ./ovsdb-server --remote=punix:$HOME/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile –detach
OVS的DPDK配置
1. 在启动ovs-vswitchd 之前,您需要启动它的数据库配置,ovsdb-server。在启动数据库之前,需要配置一个被ovsdb-server 使用的数据库。
$ cd $HOME/usr/bin
$ sudo ./ovsdb-tool create $HOME/etc/openvswitch/conf.db $HOME/usr/share/openvswitch/vswitch.ovsschema
2. 用ovs-vsctl初始化数据库。仅需在使用ovsdb-tool创建数据库后初始化一次,就可以在任意时刻运行。ovs-vswitchd需要一些额外的配置才能启用DPDK的功能。可以通过OvS表的other\_config 列将DPDK配置参数传递给ovs-vswitchd 。 至少必须将dpdk-init 选项设置为true或try。所有未明确设置的配置选项都被提供默认值。
$ cd $HOME/usr/bin
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:hw-offload=false
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:max-idle=500000
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x02
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x04
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=2048
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:n-rxq=1
$ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:n-txq=1
对于流量测试,必须为pmd-cpu-mask 参数分配一个隔离的CPU。借助以下命令检查系统上隔离的CPU:
$ cat /etc/default/grub | grep isolcpus
isolcpus=1-3
在我的N1SDP平台上,我发现CPU1-3是被隔离的。因此,我可以将CPU 2设置为0x04将它分配给pmd-cpu-mask 参数
3. 启动主Open vSwitch Daemon,让它连接到先前创建的同一Unix域套接字。
$ export DB_SOCK=$HOME/var/run/openvswitch/db.sock
$ cd $HOME/usr/sbin
$ sudo ./ovs-vswitchd unix:$DB_SOCK --pidfile --detach --log-file=$HOME/var/log/openvswitch/ovs-vswitchd.log
如果DPDK初始化成功,那么以下日志项将被显示:
|dpdk|INFO|DPDK Enabled – initialized
PHY-PHY配置
1. 添加Userspace brisge [YS1] [Ben Song2] 。 ovs-vsctl 命令可用于此目的。 应该使用与DPDK数据路径相对应的datapath\_type=netdev 创建网桥。
$ cd $HOME/usr/bin
$ sudo ./ovs-vsctl add-br dpdk-br1 -- set bridge dpdk-br1 datapath_type=netdev
2. 添加两个DPDK端口。ovs-vsctl 命令也可以用于此目的。
$ sudo ./ovs-vsctl add-port dpdk-br1 dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=
ofport_request=1
$ sudo ./ovs-vsctl add-port dpdk-br1 dpdk2 -- set Interface dpdk2 type=dpdk options:dpdk-devargs= ofport_request=2
此时,可以使用以下命令查看网桥以及与网桥相关联的端口配置情况:
$ sudo ./ovs-vsctl show
3. 调出网桥及其接口。
$ sudo ip link set dpdk-br1 up
4. 添加测试流以便在DPDK端口之间转发数据包。流被成功配置后可以看到传输到任一端口的流量在另一端口返回。
$ sudo ./ovs-ofctl add-flow dpdk-br1 in_port=1,action=output:2
$ sudo ./ovs-ofctl add-flow dpdk-br1 in_port=2,action=output:1
此时,PHY-PHY测试的设置已全部完成,现在要做的就是配置流量发射器给DUT发送流量。
结束语
本文提供了有关如何为PHY-PHY测试使用DPDK设置OvS的分步教程。本文介绍的设置方法主要来自OvS官方文档,但着重介绍了与hugepage和OvS的DPDK配置相关的一些重要点。 这将有助于避免潜在的问题从而获得最佳的流量测试环境。
本系列中的其他博客:
- Arm上带有DPDK的Open vSwitch的简介
- 第一章:构建与安装
- 第三章:PHY-VM-PHY (vHost Loopback)测试的设置
作者:Malvika Gupta
翻译:Khorina
原文链接:https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/open-vswitch-with-dpdk-on-arm-build-and-install-from-source