DPDK安裝
從官網(wǎng)下載DPDK安裝包,常用的版本是:dpdk-16.07
1.解壓:
tar?zxvf?dpdk-16.07.tar.gz
cd?? dpdk-16.07
2.設(shè)置環(huán)境變量:
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模塊和綁定網(wǎng)卡:(建議使用dpdk-setup.sh腳本)
cd?$(RTE_SDK)/tools/
./dpdk-setup.sh
運(yùn)行如下圖所示:
根據(jù)腳本步驟提示丁存,完成編譯哪個(gè)DPDK,加載哪種驅(qū)動(dòng)腔剂,綁定網(wǎng)卡等一系列動(dòng)作。
6.1.選擇[16]x86_64-native-linuxapp-gcc驼仪,等待編譯完成
x86_64:系統(tǒng)架構(gòu)
native:平臺(tái)自適應(yīng)
linuxapp:linux的應(yīng)用程序
gcc:使用GCC編譯器
6.2 選擇[19] Insert IGB UIO
module 掸犬,加載驅(qū)動(dòng),常用的是IGB驅(qū)動(dòng)
選擇[25] Bind Ethernet device to IGB UIO module绪爸,綁定網(wǎng)卡到IGB驅(qū)動(dòng)湾碎,輸入網(wǎng)卡的PCI地址,中間用空格隔開奠货。
選擇[24] Display current Ethernet device settings 介褥,查看當(dāng)前網(wǎng)卡設(shè)置
如下圖:
圖中可以看出,DPDK使用的網(wǎng)卡有4塊I350递惋。
6.3選擇 [30] List hugepage info from /proc/meminfo 柔滔,可顯示當(dāng)前巨頁信息,也可以通過
[22] Setup hugepage mappings for non-NUMAsystems?? 或者
[23] Setup hugepage mappings for NUMAsystems
為系統(tǒng)設(shè)置巨頁萍虽,但不建議在這里設(shè)置睛廊,請(qǐng)查看第5點(diǎn)或系統(tǒng)配置里的描述。
退出dpdk_setup.sh:輸入36.? [36]Exit Script
注1:查看系統(tǒng)是否為NUMA架構(gòu):執(zhí)行$(RTE_SDK)/tools/cpu_layout.py 杉编,如果有2個(gè)Socket信息超全,為NUMA架構(gòu),只有1個(gè)Socket信息邓馒,則為non-NUMA架構(gòu)嘶朱。
注2:一般PCI ID 小于0000:08:00.x的網(wǎng)卡在Socket0,大于或等于0000:08:00.x的在Socket1.
7.執(zhí)行完以上6步光酣,DPDK環(huán)境已經(jīng)初始化好了疏遏,可以正常地跑DPDK的程序了,但系統(tǒng)的配置沒有達(dá)到最優(yōu)救军。
系統(tǒng)配置
1. BIOS設(shè)置,將BIOS中的性能參數(shù)設(shè)置到最優(yōu)改览,關(guān)閉任何省電配置和虛擬化選項(xiàng),比如:
CPU Power and Performance Policy
CPU C-state Disabled
CPU P-state Disabled
Enhanced Intel? Speedstep? Tech Disabled
Turbo Boost Disabled
等等
2.Boot設(shè)置缤言,要保證DPDK綁定的核心不被系統(tǒng)調(diào)度,因此需要將核心從內(nèi)核調(diào)度中隔離视事。
修改/etc/default/grub文件胆萧,在GRUB_CMDLINE_LINUX行中加入isolcpus=2,3,4,5,6 transparent_hugepage=never
執(zhí)行:grub2-mkconfig -o /boot/grub2/grub.cfg
(將修改后的配置刷新新/boot中配置去,此步驟操作完,則系統(tǒng)的啟動(dòng)參數(shù)真正的被修改了)
查看CPU性能是否為最優(yōu),執(zhí)行:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
3./etc/default/grub,加入isolcpus時(shí)需要注意跌穗,加入的邏輯核心需要在同一個(gè)Socket上订晌,non-NUMA架構(gòu)只有一個(gè)Socket,只需要將要隔離的核心加上即可蚌吸,在NUMA架構(gòu)上就先要知道Socket1和Socket2上的核心有哪些锈拨?
執(zhí)行$(RTE_SDK)/tools/cpu_layout.py可查看核心屬性哪個(gè)Socket。把與網(wǎng)卡在同一Socket上的core添加到isolcpus中羹唠,目前用的i350,是綁定在Socket0中
4.設(shè)置巨頁,系統(tǒng)默認(rèn)是2M奕枢,如下圖:
如果要修改為1G巨頁,參考下圖佩微,修改GRUB_CMDLINE_LINUX為:
把default_hugepagesz設(shè)為1G缝彬,hugepagesz設(shè)為1G,hugepages設(shè)為8哺眯,表示設(shè)置8塊1G的巨頁谷浅,然后執(zhí)行:grub2-mkconfig -o /boot/grub2/grub.cfg? 執(zhí)行之后重啟服務(wù)器。
5.查看配置信息常用命令
查看系統(tǒng)巨頁:cat /proc/meminfo| grep -i huge
查看綁定的網(wǎng)卡:./$(RTE_SDK)/tools/dpdk-devbind.py-s
查看網(wǎng)卡PCI信息:lspci | grep -i eth
查看lcore在哪個(gè)Socket上:./$(RTE_SDK)/cpu_layout.py
查看掛載點(diǎn)信息:cat /proc/mounts?? 或者mount
查看CPU型號(hào):cat /proc/cpuinfo | grep -i 'model name'
查看內(nèi)存頻率:dmidecode -t memory | grep Speed
功能點(diǎn)測(cè)試
Testpmd測(cè)試:
在初始化完DPDK環(huán)境后奶卓,我們通常需要測(cè)試環(huán)境是否正常一疯,我們使用的測(cè)試程序是用dpdk_setup.sh腳本,因?yàn)榉奖愣峁谩?dòng)腳本之后墩邀,選擇
[29] Run testpmdapplication in interactive mode ($RTE_TARGET/app/testpmd)
然后輸入掩碼位,如果綁定了4個(gè)網(wǎng)口,輸入:0xf0即可瑟幕。
由于testpmd的命令很多磕蒲,無法一一說明,這里只驗(yàn)證環(huán)境是否正常只盹。
1.輸入 辣往? 可查看所有的命令。
2.往端口上發(fā)送數(shù)據(jù)殖卑,查看是否有收到數(shù)據(jù)站削,查看命令:show port stats all
如果收有數(shù)據(jù),則環(huán)境正常
3.退出:quit
4.退出腳本:輸入36.? [36]Exit Script
Test測(cè)試:
這個(gè)測(cè)試是各個(gè)庫模塊的獨(dú)立測(cè)試
編譯:
cd $(RTE_SDK)
make –C app/test
執(zhí)行:./app/test/test –c 0xf0 –n 4
輸入 孵稽? 查看所有的測(cè)試單元
輸入version_autotest
RTE>>version_autotest
Version string: 'DPDK 16.07.0'
Test OK
RTE>>
這里面有很多測(cè)試许起,常用的有核心的測(cè)試:per_lcore_autotest
內(nèi)存的測(cè)試:memory_autotest 隊(duì)列性能測(cè)試:ring_perf_autotest 等等
可以測(cè)試隊(duì)列大小對(duì)性能的影響,可以測(cè)試使用不同的隊(duì)列接口函數(shù)對(duì)性能的影響菩鲜,也可以測(cè)試burst_size 或bulk_size大小不同园细,對(duì)性能的影響,因?yàn)槲覀兊某绦蚺c這里的測(cè)試環(huán)境是一樣的接校,這里的測(cè)試結(jié)果對(duì)修改一些程序參數(shù)可以起到參考作用猛频。
RTE>>quit
注:test程序也可以通過 dpdk_setup.sh啟動(dòng)狮崩,選擇
[28] Run test application($RTE_TARGET/app/test)
問題解決
1. 編譯DPDK程序的時(shí)候,出現(xiàn):
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的時(shí)候出現(xiàn)鹿寻,發(fā)現(xiàn)/usr/src/kernels/? 中沒有3.10.0-327.36.3.el7.x86_64
解決:
rpm -ivhkernel-devel-3.10.0-123.el7.x86_64.rpm?????????? #要先下載對(duì)應(yīng)的rpm包:
https://buildlogs.centos.org/c7-updates/kernel/3.10.0-123.el7/20140630120647/
2.執(zhí)行腳本./dpdk_devbind.py –s 出現(xiàn)下面的問題:
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.執(zhí)行skeleton出現(xiàn)下面現(xiàn)象:
...
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 執(zhí)行以下操作
remod igb_uio
insmod
igb_uio
DPDK的基礎(chǔ)就介紹到這里,下次再統(tǒng)一介紹 l2fwd,l3fwd,test-pipeline等模型毡熏。