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$ sudp ./usertools/
cpu_layout.py    dpdk-pmdinfo.py  meson.build      
dpdk-devbind.py  dpdk-setup.sh    
wlw@greenvm-wlwv:~/dpdk/dpdk-stable-18.02.2$ sudp ./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程序。
运行一个简单的应用程序示例:
注意,在运行应用程序之前要确保:
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的内存通道数量。

一个网卡可能有多个网口,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$

猜你喜欢

转载自blog.csdn.net/jiechuhoudeshang/article/details/89213594
今日推荐