dpdk編譯,詳細的環境搭建過程

dpdk環境的搭建過程:

Linux平臺上DPDK入門指南:中文,比較詳細
https://dpdk-docs.readthedocs.io/en/latest/linux_gsg/index.html

dpdk編譯:
dpdk依賴庫:
https://www.cnblogs.com/vancasola/p/8881197.html
按上述網址安裝完所有的依賴庫後,按以下命令安裝(腳本):
export RTE_SDK=/home/wlw/dpdk/dpdk-stable-18.02.2
export RTE_TARGET=x86_64-native-linuxapp-gcc
make config T=x86_64-native-linuxapp-gcc
wlw@greenvm-wlwv:~/dpdk/dpdk-stable-18.02.2$ sudo ./usertools/
cpu_layout.py    dpdk-pmdinfo.py  meson.build      
dpdk-devbind.py  dpdk-setup.sh    
wlw@greenvm-wlwv:~/dpdk/dpdk-stable-18.02.2$ sudo ./usertools/dpdk-setup.sh
選14編譯

綁定網卡:
./dpdk-devbind.py --status
wlw@greenvm-wlwv:~/dpdk/dpdk-stable-18.02.2/usertools$ sudo ifconfig eth0 down
wlw@greenvm-wlwv:~/dpdk/dpdk-stable-18.02.2/usertools$ sudo ./dpdk-devbind.py --bind=igb_uio eth0
解綁網卡:
./dpdk-setup.sh 29


TLB與hugepage:深入淺出dpdk 47頁
在之前的章節我們提到了TLB,TLB和Cache本質上是一樣的,都是一種高速的SRAM,存放了內存中內容的一份快照或者備份,以便處理器能夠快速地訪問,減少等待的時間。有所不同的是,Cache存放的是內存中的數據或者代碼,或者說是任何內容,而TLB存放的是頁表項。
提到頁表項,有必要簡短介紹一下處理器的發展歷史。最初的程序員直接對物理地址編程,自己去管理內存,這樣不僅對程序員要求高,編程效率低,而且一旦程序出現問題也不方便進行調試。特別還出現了惡意程序,這對計算機系統危害實在太大,因而後來不同的體系架構推出了虛擬地址和分頁的概念。
分頁是指把物理內存分成固定大小的塊,按照頁來進行分配和釋放。一般常規頁大小爲4K(2 12 )個字節,之後又因爲一
些需要,出現了大頁,比如2M(2 20 )個字節和1G(2 30 )個字節的大小,我們後面會講到爲什麼使用大頁。
虛擬地址是指程序員使用虛擬地址進行編程,不用關心物理內存的大小,即使自己的程序出現了問題也不會影響其他程序的運行和系統的穩定。而處理器在寄存器收到虛擬地址之後,根據頁表負責把虛擬地址轉換成真正的物理地址。
首先,Linux操作系統採用了基於hugetlbfs的特殊文件系統來加入對2MB或者1GB的大頁面支持。這種採用特殊文件系統形式支持大頁面的方式,使得應用程序可以根據需要靈活地選擇虛存頁面大小,而不會被強制使用2MB大頁面。

NUMA系統:深入淺出dpdk 51頁
內存是統一結構、統一尋址的(UMA,Uniform Memory Architecture)。
查看系統是否是numa系統:
uname -a
lscpu
如果不能確認是單節點系統還是NUMA系統,則兩個都配置一下:
法一:
對於單節點系統,使用以下命令(假設需要1024個頁):
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
對於NUMA設備,則分配應該明確指定在哪個節點上:
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
法二:
wlw@ubuntu:~/workspace/source/dpdk/dpdk-stable-18.02.2$ ./usertools/dpdk-setup.sh
選擇20或者21,然後輸入64

DPDK也是使用HUGETLBFS來使用大頁:  深入淺出dpdk 48頁(裏面有永久保存配置)
在大頁預留之後,接下來則涉及使用的問題。我們以DPDK爲例來說明如何使用大頁。
DPDK也是使用HUGETLBFS來使用大頁。首先,它需要把大頁mount到某個路徑,比如/mnt/huge,以下是命令:
mkdir /mnt/huge
sudo mount -t hugetlbfs nodev /mnt/huge

加載模塊啓動DPDK環境需要的UIO功能:https://dpdk-docs.readthedocs.io/en/latest/linux_gsg/index.html中3.4節
要運行任何的DPDK應用程序,需要將合適的uio模塊加載當前內核中。在大多數情況下,Linux內核包含了標準的uio_pci_generic模塊就可以提供uio能力。該模塊可以使用以下命令加載:
sudo modprobe uio_pci_generic
區別於uio_pci_generic,DPDK提供了一個igb_uio模塊(可以在kmod目錄下找到)。加載方式如下:
sudo modprobe uio
sudo insmod kmod/igb_uio.ko
注:對於一個不支持傳統中斷的設備,例如虛擬功能(VF)設備,必須使用igb_uio來代替uio_pci_generic。

綁定及解綁網卡:
雖然任何用戶都可以運行dpdk-devbind.py腳本來查看網絡端口的狀態,但綁定或解除綁定網絡端口需要root權限。
    要查看系統中所有網絡端口的狀態,請執行以下操作:
./usertools/dpdk-devbind.py --status

Network devices using DPDK-compatible driver
============================================
0000:82:00.0 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe

Network devices using kernel driver
===================================
0000:04:00.0 'I350 1-GbE NIC' if=em0  drv=igb unused=uio_pci_generic *Active*
0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=uio_pci_generic
0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=uio_pci_generic
0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=uio_pci_generic

Other network devices
=====================
<none>
  要將設備eth1,“04:00.1”綁定到uio_pci_generic驅動程序:
./usertools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1
或者可選地,
./usertools/dpdk-devbind.py --bind=uio_pci_generic eth1
  要將設備82:00.0恢復到其原來的內核綁定:
./usertools/dpdk-devbind.py --bind=ixgbe 82:00.0

設備在服務器上解綁舉例:(./usertools/dpdk-devbind.py --bind=i40e  0000:3d:00.1命令即可解綁)
root@ubuntu:~/dpdk_source/dpdk-stable-18.02.2# ./usertools/dpdk-devbind.py -s  

Network devices using DPDK-compatible driver 
============================================ 
0000:3d:00.0 'Device 37d3' drv=uio_pci_generic unused=i40e //說明uio_pci_generic是dpdk使用的網卡驅動,i40e是未應用的內核網卡驅動,
0000:3d:00.1 'Device 37d3' drv=uio_pci_generic unused=i40e //因此應用./usertools/dpdk-devbind.py --bind=i40e  0000:3d:00.1命令即可解綁

Network devices using kernel driver 

0000:19:00.0 'I350 Gigabit Network Connection 1521' if=ens3f0 drv=igb unused=uio_pci_generic *Active* 
0000:19:00.1 'I350 Gigabit Network Connection 1521' if=ens3f1 drv=igb unused=uio_pci_generic 
0000:19:00.2 'I350 Gigabit Network Connection 1521' if=ens3f2 drv=igb unused=uio_pci_generic 
0000:19:00.3 'I350 Gigabit Network Connection 1521' if=ens3f3 drv=igb unused=uio_pci_generic *Active* 
0000:5f:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=ens1f0 drv=ixgbe unused=uio_pci_generic 
0000:5f:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection 10fb' if=ens1f1 drv=ixgbe unused=uio_pci_generic

root@ubuntu:~/dpdk_source/dpdk-stable-18.02.2# ./usertools/dpdk-devbind.py --bind=i40e  0000:3d:00.1 
root@ubuntu:~/dpdk_source/dpdk-stable-18.02.2# ifconfig -a 
enp61s0f0 Link encap:Ethernet  HWaddr 48:bd:3d:2e:91:66 
          BROADCAST MULTICAST  MTU:1500  Metric:1 
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  

enp61s0f1 Link encap:Ethernet  HWaddr 48:bd:3d:2e:91:67 
          BROADCAST MULTICAST  MTU:1500  Metric:1 
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)  


編譯後總體配置過程舉例,具體根據設備情況及上述說明選擇相關命令進行配置。
wlw@ubuntu:~/workspace/source/dpdk/dpdk-stable-18.02.2$ ./usertools/dpdk-setup.sh
選擇20或者21,然後輸入64
或者
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge


sudo modprobe uio_pci_generic
sudo ifconfig enp61s0f1 down
sudo ./usertools/dpdk-devbind.py --bind=uio_pci_generic enp61s0f1
export RTE_SDK=/home/wlw/dpdk/dpdk-stable-18.02.2/
export RTE_TARGET=x86_64-native-linuxapp-gcc
sudo ./usertools/dpdk-devbind.py --status 
上述都屬於dpdk環境的搭建過程。

 

 

 

運行dpdk程序:
下面屬於在上面dpdk環境的搭建後,開始運行dpdk程序。
運行一個簡單的應用程序示例:
注意,在運行應用程序之前要確保:
1、Hugepages設置完成。
2、用到的任何內核驅動程序已加載。
3、在需要的情況下,應用程序使用的端口應該綁定到相應的內核驅動模塊上。

應用程序與DPDK目標環境的環境抽象層(EAL)庫關聯,該庫提供了所有DPDK程序通用的一些選項。
sudo ./helloworld -c 1  //該例子是在每個使用的核打印 hello from core xx
-c COREMASK要運行的內核的十六進制掩碼。注意,平臺之間編號可能不同,需要事先確定。(1:1個,3:2個,7:3個,f:4個)
線程掩碼(coremask)指定了需要參與運行的線程(核)集合。
-l CORELIST:與-c類似,核掩碼(-c 0x0f)或者核列表(-l 0-3)應該是一個意思。
-c或-l選項是必需的,其他都是可選的。
-n NUM:每個處理器socket的內存通道數量。

二層轉發實例:
export RTE_SDK=/home/wlw/dpdk/dpdk-stable-18.02.2/
export RTE_TARGET=x86_64-native-linuxapp-gcc
sudo ./examples/l2fwd/build/l2fwd -c 3 -n 2 -- -q 1 -p 1
    -p PORTMASK
    PORTMASK:一個十六進制位掩碼錶示分配的端口數量。 
    -q NQ
    NQ:表示分配給每個邏輯內核的收發隊列數量。 
    -T t
    t: 表示打印統計數據到屏幕上的時間間隔,默認爲10秒。
 

 

一個網卡可能有多個網口,dpdk對一個網卡上每個網口的稱呼叫做port。


ifconfig -a

問題:解決是缺sudo
wlw@ubuntu:~/dpdk/dpdk-stable-18.02.2/usertools$ ./../examples/helloworld/build/helloworld
rte_virtio_pmd_init(): IOPL call failed - cannot use virtio PMD
EAL: Detected 40 lcore(s)
EAL: No free hugepages reported in hugepages-1048576kB
EAL: No free hugepages reported in hugepages-2048kB
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
PANIC in main():
Cannot init EAL
5: [./../examples/helloworld/build/helloworld(_start+0x29) [0x44d7e9]]
4: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0) [0x7f1327250830]]
3: [./../examples/helloworld/build/helloworld() [0x44a21f]]
2: [./../examples/helloworld/build/helloworld(__rte_panic+0xc3) [0x442d33]]
1: [./../examples/helloworld/build/helloworld(rte_dump_stack+0x2b) [0x4ace8b]]
Aborted (core dumped)
wlw@ubuntu:~/dpdk/dpdk-stable-18.02.2/usertools$ ifconfig -a
enp61s0f0 Link encap:Ethernet  HWaddr 48:bd:3d:2e:92:8c
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41801 errors:0 dropped:1903 overruns:0 frame:20971
          TX packets:81886 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7302032 (7.3 MB)  TX bytes:8841978 (8.8 MB)

ens1f0    Link encap:Ethernet  HWaddr 48:bd:3d:35:3b:29
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ens1f1    Link encap:Ethernet  HWaddr 48:bd:3d:35:3b:2b
          inet addr:192.168.1.196  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ens3f0    Link encap:Ethernet  HWaddr 38:ad:8e:ea:e6:3b
          inet addr:192.168.102.178  Bcast:192.168.102.255  Mask:255.255.255.0
          inet6 addr: fe80::3aad:8eff:feea:e63b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1900673 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1930426 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:513011866 (513.0 MB)  TX bytes:569777099 (569.7 MB)
          Memory:a8800000-a8ffffff

ens3f1    Link encap:Ethernet  HWaddr 38:ad:8e:ea:e6:3c
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Memory:a8000000-a87fffff

ens3f2    Link encap:Ethernet  HWaddr 38:ad:8e:ea:e6:3d
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Memory:a7800000-a7ffffff

ens3f3    Link encap:Ethernet  HWaddr 38:ad:8e:ea:e6:3e
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Memory:a7000000-a77fffff

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:28523 errors:0 dropped:0 overruns:0 frame:0
          TX packets:28523 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:9693747 (9.6 MB)  TX bytes:9693747 (9.6 MB)

virbr0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

virbr0-nic Link encap:Ethernet  HWaddr 52:54:00:11:25:3d
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlw@ubuntu:~/dpdk/dpdk-stable-18.02.2/usertools$
wlw@ubuntu:~/dpdk/dpdk-stable-18.02.2/usertools$ sudo ./../examples/helloworld/build/helloworld
EAL: Detected 40 lcore(s)
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Multi-process socket /var/run/.rte_unix
EAL: Probing VFIO support...
EAL: PCI device 0000:19:00.0 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:19:00.1 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:19:00.2 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:19:00.3 on NUMA socket 0
EAL:   probe driver: 8086:1521 net_e1000_igb
EAL: PCI device 0000:3d:00.0 on NUMA socket 0
EAL:   probe driver: 8086:37d3 net_i40e
EAL: PCI device 0000:3d:00.1 on NUMA socket 0
EAL:   probe driver: 8086:37d3 net_i40e
PMD: Global register is changed during support QinQ parser
PMD: Global register is changed during configure hash input set
PMD: Global register is changed during configure fdir mask
PMD: Global register is changed during configure hash mask
PMD: Global register is changed during support QinQ cloud filter
PMD: Global register is changed during disable FDIR flexible payload
EAL: PCI device 0000:5f:00.0 on NUMA socket 0
EAL:   probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:5f:00.1 on NUMA socket 0
EAL:   probe driver: 8086:10fb net_ixgbe
hello from core 1
hello from core 2
hello from core 3
hello from core 4
hello from core 5
hello from core 6
hello from core 7
hello from core 8
hello from core 9
hello from core 10
hello from core 11
hello from core 12
hello from core 13
hello from core 14
hello from core 15
hello from core 16
hello from core 17
hello from core 18
hello from core 19
hello from core 21
hello from core 22
hello from core 20
hello from core 23
hello from core 24
hello from core 25
hello from core 26
hello from core 27
hello from core 28
hello from core 29
hello from core 30
hello from core 31
hello from core 32
hello from core 33
hello from core 34
hello from core 35
hello from core 36
hello from core 37
hello from core 38
hello from core 39
hello from core 0
wlw@ubuntu:~/dpdk/dpdk-stable-18.02.2/usertools$

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章