去年曾經(jīng)寫過(guò)一篇在虛擬機(jī)里配置DPDK的文章,當(dāng)時(shí)DPDK還沒有支持ubuntu16.04,而且當(dāng)時(shí)還不會(huì)shell編程,總體來(lái)說(shuō)還是比較幼稚的柑司。今天整理了一下寫了這篇ubuntu16.04實(shí)體機(jī)下的DPDK配置博文。
DPDK是因特爾推出的數(shù)據(jù)平面開發(fā)組件锅劝,主要是提供了一個(gè)高效的用戶態(tài)網(wǎng)卡驅(qū)動(dòng)攒驰,改以往網(wǎng)卡驅(qū)動(dòng)采用的中斷方式,為綁定線程輪詢網(wǎng)卡的高效模式故爵,可以大幅提高吞吐率玻粪。DPDK最新版的壓縮包可以去官網(wǎng)下載,http://dpdk.org/download. 我這里用的環(huán)境是ubuntu16.04,DPDK版本是16.11.1
在安裝DPDK之前我們需要安裝另一個(gè)linux下另一個(gè)跟網(wǎng)絡(luò)數(shù)據(jù)包相關(guān)的函數(shù)庫(kù)——libpcap奶段,命令行抓包軟件tcpdump也是基于這個(gè)庫(kù)實(shí)現(xiàn)的。
1. 安裝libpcap
去官網(wǎng) http://www.tcpdump.org/#latest-releases 下載libpcap的壓縮包剥纷。我下的是libpcap-1.8.1.
先安裝依賴庫(kù)m4痹籍、bison、flex:
sudo apt-get install m4 bison flex
在特權(quán)用戶下晦鞋,安裝libpcap:
cd libpcap-1.8.1
./configure
make
make install
安裝成功蹲缠,但是后面安裝DPDK的時(shí)候卻提示找不到libpcap.so.1,因?yàn)閘ibpcap.so.1默認(rèn)安裝到了/usr/local/lib下悠垛,我們做一個(gè)符號(hào)鏈接到/usr/lib/下即可线定。
sudo ln -s /usr/local/lib/libpcap.so.1 /usr/lib/libpcap.so.1
2. 安裝DPDK
將壓縮包解壓縮,按照下面的步驟安裝:
注意确买,以下操作中有些涉及特權(quán)級(jí)的斤讥,如果operation denied,加上sudo即可
2.1. 配置并編譯DPDK,架構(gòu)為64位x86linux系統(tǒng)湾趾,gcc編譯
make config T=x86_64-native-linuxapp-gcc
sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config
make
編譯過(guò)程如上圖所示芭商,其中如果有錯(cuò),多數(shù)是由于依賴項(xiàng)搀缠,安裝上依賴項(xiàng)就可以了铛楣。
2.2. 預(yù)配置大頁(yè)存儲(chǔ)
掛載了一個(gè)NUMA節(jié)點(diǎn)node0,最后一句命令的意思是在node0上預(yù)留了64個(gè)2MB的大頁(yè)艺普,即64*2048kB=128MB的內(nèi)存
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
查看網(wǎng)卡信息
ifconfig
從圖中看出簸州,兩個(gè)網(wǎng)卡分別為enp3s0和wlp2s0。
2.3. 加載模塊和綁定網(wǎng)卡
ifconfig enp3s0 down//先把有線網(wǎng)卡關(guān)掉歧譬,不然下一步會(huì)報(bào)錯(cuò)的岸浑。
modprobe uio
insmod build/kmod/igb_uio.ko//插入uio和igb_uio模塊
這一步有可能會(huì)報(bào)錯(cuò),不能插入該模塊瑰步,網(wǎng)上查原因是因?yàn)閘inux 4.3.X以后的內(nèi)核機(jī)制造成的助琐,需要重啟電腦進(jìn)入bios,關(guān)閉secure boot即可面氓。
python tools/dpdk-devbind.py --bind=igb_uio enp3s0//綁定igb_uio驅(qū)動(dòng)到enp3s0
使用dpdk自帶腳本查看狀態(tài)
python tools/dpdk-devbind.py --status
從圖中可以看到0000:03:00.0網(wǎng)卡綁定的是igb_uio驅(qū)動(dòng)兵钮,網(wǎng)卡綁定成功。
由于每次運(yùn)行DPDK都需要分配大頁(yè)和綁定網(wǎng)卡驅(qū)動(dòng)舌界,很麻煩掘譬,可以編寫一個(gè)shell腳本,每次運(yùn)行直接配置完成呻拌。
腳本內(nèi)容如下:
#!/bin/bash
DEVICE="enp3s0"
DRIVER="igb_uio"
while getopts ":hd:r:" optname
do
case "$optname" in
"h")
echo " `basename ${0}`:usage:[-d device_name] [-r driver_name]"
echo " where device_name can be one in: {enp3s0,wlp2s0},driver_name can be one in: {igb_uio,rte_kni}"
exit 1
;;
"d")
DEVICE=$OPTARG
;;
"r")
DRIVER=$OPTARG
;;
*)
# Should not occur
echo "Unknown error while processing options"
;;
esac
done
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
ifconfig $DEVICE down
modprobe uio
insmod build/kmod/$DRIVER.ko
./tools/dpdk-devbind.py --bind=$DRIVER $DEVICE
另外葱轩,再寫一個(gè)類似的反向的腳本,如果想要將網(wǎng)卡恢復(fù)正常驅(qū)動(dòng)使用的時(shí)候可以恢復(fù):
#!/bin/bash
DEVICE="0000:03:00.0"
DRIVER="alx"
while getopts ":hd:r:" optname
do
case "$optname" in
"h")
echo " `basename ${0}`:usage:[-d device_name] [-r driver_name]"
echo " where device_name can be one in: {0000:02:00.0,0000:03:00.0},driver_name can be one in: {alx,iwlwifi}"
exit 1
;;
"d")
DEVICE=$OPTARG
;;
"r")
DRIVER=$OPTARG
;;
*)
# Should not occur
echo "Unknown error while processing options"
;;
esac
done
./tools/dpdk-devbind.py --bind=$DRIVER $DEVICE
上面的網(wǎng)卡分別是enp3s0和wlp2s0,它們自身的驅(qū)動(dòng)分別是alx和iwlwifi靴拱,根據(jù)實(shí)際修改垃喊。另外DPDK有些網(wǎng)卡是不支持的,需要去官網(wǎng)查看哪些網(wǎng)卡不支持袜炕。
運(yùn)行如下圖:
3. 運(yùn)行示例程序:
注意本谜,這里演示用的是pcap的vdev,所以不需要綁定網(wǎng)卡偎窘,不然會(huì)報(bào)錯(cuò)找不到設(shè)備乌助。當(dāng)然vdev也可以按照官方教程里給的跑dpdk的vdev
./build/app/testpmd -c 7 -n 3 --vdev=eth_pcap0,iface=enp3s0 --vdev=eth_pcap1,iface=enp3s0 -- -i --nb-cores=2 --nb-ports=2 --total-num-mbufs=2048
//參數(shù)分別為-c <核數(shù),二進(jìn)制表示,7即111陌知,三個(gè)核> -n<存儲(chǔ)通道數(shù)> --vdev<虛擬設(shè)備名他托,自己給發(fā)包網(wǎng)卡起的名字>,iface<真實(shí)設(shè)備id> -- 端口數(shù),buff數(shù)
運(yùn)行截圖:
在testpmd輸入start開始轉(zhuǎn)發(fā)流
輸入stop仆葡,停止并顯示這期間的流量赏参。quit退出程序。