DPDK使用入门(补充)

DPDK安装

从官网下载DPDK安装包,常用的版本是:dpdk-16.07

1.解压:

tar zxvf dpdk-16.07.tar.gz

cd   dpdk-16.07

2.设置环境变量:

export RTE_SDK=$(pwd)          #DPDK主目录

exportRTE_TARGET=x86_64-native-linuxapp-gcc

3.使用pcap库:

make config T=x86_64-native-linuxapp-gcc

sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config

4.编译:

make   等等编译完成

5.挂载巨页:

mkdir -p /mnt/huge

mount -t hugetlbfs nodev /mnt/huge

echo 2048 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages


6.加载IGB模块和绑定网卡:(建议使用dpdk-setup.sh脚本)

cd $(RTE_SDK)/tools/

./dpdk-setup.sh

运行如下图所示:

dpdk-setup.sh

根据脚本步骤提示,完成编译哪个DPDK,加载哪种驱动,绑定网卡等一系列动作。

6.1.选择[16]x86_64-native-linuxapp-gcc,等待编译完成

x86_64:系统架构

native:平台自适应

linuxapp:linux的应用程序

gcc:使用GCC编译器

6.2 选择[19] Insert IGB UIO

module ,加载驱动,常用的是IGB驱动

选择[25] Bind Ethernet device to IGB UIO module,绑定网卡到IGB驱动,输入网卡的PCI地址,中间用空格隔开。

选择[24] Display current Ethernet device settings ,查看当前网卡设置

如下图:

显示网卡设置

图中可以看出,DPDK使用的网卡有4块I350。

6.3选择 [30] List hugepage info from /proc/meminfo ,可显示当前巨页信息,也可以通过

[22] Setup hugepage mappings for non-NUMAsystems   或者

[23] Setup hugepage mappings for NUMAsystems

为系统设置巨页,但不建议在这里设置,请查看第5点或系统配置里的描述。

退出dpdk_setup.sh:输入36.  [36]Exit Script

注1:查看系统是否为NUMA架构:执行$(RTE_SDK)/tools/cpu_layout.py ,如果有2个Socket信息,为NUMA架构,只有1个Socket信息,则为non-NUMA架构。

注2:一般PCI ID 小于0000:08:00.x的网卡在Socket0,大于或等于0000:08:00.x的在Socket1.

7.执行完以上6步,DPDK环境已经初始化好了,可以正常地跑DPDK的程序了,但系统的配置没有达到最优。

系统配置

1. BIOS设置,将BIOS中的性能参数设置到最优,关闭任何省电配置和虚拟化选项,比如:

CPU Power and Performance Policy

CPU C-state Disabled

CPU P-state Disabled

Enhanced Intel® Speedstep® Tech Disabled

Turbo Boost Disabled

等等

2.Boot设置,要保证DPDK绑定的核心不被系统调度,因此需要将核心从内核调度中隔离。

修改/etc/default/grub文件,在GRUB_CMDLINE_LINUX行中加入isolcpus=2,3,4,5,6 transparent_hugepage=never

执行:grub2-mkconfig -o /boot/grub2/grub.cfg

(将修改后的配置刷新新/boot中配置去,此步骤操作完,则系统的启动参数真正的被修改了)

查看CPU性能是否为最优,执行:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

3./etc/default/grub,加入isolcpus时需要注意,加入的逻辑核心需要在同一个Socket上,non-NUMA架构只有一个Socket,只需要将要隔离的核心加上即可,在NUMA架构上就先要知道Socket1和Socket2上的核心有哪些?

执行$(RTE_SDK)/tools/cpu_layout.py可查看核心属性哪个Socket。把与网卡在同一Socket上的core添加到isolcpus中,目前用的i350,是绑定在Socket0中

4.设置巨页,系统默认是2M,如下图:

2M巨页

如果要修改为1G巨页,参考下图,修改GRUB_CMDLINE_LINUX为:

1G巨页

把default_hugepagesz设为1G,hugepagesz设为1G,hugepages设为8,表示设置8块1G的巨页,然后执行:grub2-mkconfig -o /boot/grub2/grub.cfg  执行之后重启服务器。

5.查看配置信息常用命令

查看系统巨页:cat /proc/meminfo| grep -i huge

查看绑定的网卡:./$(RTE_SDK)/tools/dpdk-devbind.py-s

查看网卡PCI信息:lspci | grep -i eth

查看lcore在哪个Socket上:./$(RTE_SDK)/cpu_layout.py

查看挂载点信息:cat /proc/mounts   或者mount

查看CPU型号:cat /proc/cpuinfo | grep -i 'model name'

查看内存频率:dmidecode -t memory | grep Speed

功能点测试

Testpmd测试:

在初始化完DPDK环境后,我们通常需要测试环境是否正常,我们使用的测试程序是用dpdk_setup.sh脚本,因为方便。启动脚本之后,选择

[29] Run testpmdapplication in interactive mode ($RTE_TARGET/app/testpmd)

然后输入掩码位,如果绑定了4个网口,输入:0xf0即可。

由于testpmd的命令很多,无法一一说明,这里只验证环境是否正常。

1.输入 ? 可查看所有的命令。

2.往端口上发送数据,查看是否有收到数据,查看命令:show port stats all

如果收有数据,则环境正常

3.退出:quit

4.退出脚本:输入36.  [36]Exit Script

Test测试:

这个测试是各个库模块的独立测试

编译:

cd $(RTE_SDK)

make –C app/test

执行:./app/test/test –c 0xf0 –n 4

输入 ? 查看所有的测试单元

输入version_autotest

RTE>>version_autotest

Version string: 'DPDK 16.07.0'

Test OK

RTE>>

这里面有很多测试,常用的有核心的测试:per_lcore_autotest

内存的测试:memory_autotest 队列性能测试:ring_perf_autotest 等等

可以测试队列大小对性能的影响,可以测试使用不同的队列接口函数对性能的影响,也可以测试burst_size 或bulk_size大小不同,对性能的影响,因为我们的程序与这里的测试环境是一样的,这里的测试结果对修改一些程序参数可以起到参考作用。

RTE>>quit

注:test程序也可以通过 dpdk_setup.sh启动,选择

[28] Run test application($RTE_TARGET/app/test)

问题解决

1. 编译DPDK程序的时候,出现:

make: ***/lib/modules/3.10.0-123.el7.x86_64/build: No such file or directory.

解决:

cd/lib/modules/3.10.0-123.el7.x86_64/

ln -s/usr/src/kernels/3.10.0-327.36.3.el7.x86_64/ build

1.1.如果在解决问题1的时候出现,发现/usr/src/kernels/  中没有3.10.0-327.36.3.el7.x86_64

解决:

rpm -ivhkernel-devel-3.10.0-123.el7.x86_64.rpm           #要先下载对应的rpm包:

https://buildlogs.centos.org/c7-updates/kernel/3.10.0-123.el7/20140630120647/

2.执行脚本./dpdk_devbind.py –s 出现下面的问题:

Traceback (most recent call last):

  File "./dpdk_nic_bind.py", line539, in

    main()

  File "./dpdk_nic_bind.py", line535, in main

    get_nic_details()

  File "./dpdk_nic_bind.py", line228, in get_nic_details

    dev_lines =check_output(["lspci", "-Dvmmn"]).splitlines()

  File "./dpdk_nic_bind.py", line120, in check_output

    stderr=stderr).communicate()[0]

  File"/usr/lib64/python2.7/subprocess.py", line 711, in __init__

    errread, errwrite)

  File"/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child

    raise child_exception

OSError: [Errno2] No such file or directory


这是由于没有安装 lspci的原因。

解决:yum installpciutils -y


3.执行skeleton出现下面现象:

...

EAL: Error reading from file descriptor 13:Input/output error

EAL: Error reading from file descriptor 15:Input/output error

...

修改代码行

lib/librte_eal/linuxapp/igb_uio/igb_uio.c

把pci_intx_mask_supported(dev) 修改为pci_intx_mask_supported(dev)||true

重新编译dpdk.

用dpdk-setup.sh 执行以下操作

remod igb_uio

insmod

igb_uio


DPDK的基础就介绍到这里,下次再统一介绍 l2fwd,l3fwd,test-pipeline等模型。

推荐阅读更多精彩内容