vesperW · 2020年09月16日

Arm上带DPDK的Open vSwitch:第二章PHY-PHY 测试的设置

总览

本文是“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

1.jpg

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配置相关的一些重要点。 这将有助于避免潜在的问题从而获得最佳的流量测试环境。

本系列中的其他博客:

作者: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

推荐阅读
关注数
23360
内容数
883
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息