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,加载哪种驱动,绑定网卡等一系列动作。
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,如下图:
如果要修改为1G巨页,参考下图,修改GRUB_CMDLINE_LINUX为:
把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等模型。