sudo apt install build-essential
// 检验gcc版本
gcc --version
gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
pip3 install meson ninja
apt-get install libnuma-dev
1.查看宿主机中内存页的大小
通常情况下,内存页大小为4KB。
getconf PAGESIZE
4096
2.查看宿主机中透明大页是否开启
cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
3.开启透明大页
echo always > /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
4.查看宿主机中HugePage的大小
cat /proc/meminfo |grep -i HugePages
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
HugePages_Total: Hugepage的页面数量
HugePages_Free: 剩余的页面数量
HugePages_Rsvd: 被分配预留但是还没有使用的page数目
HugePages_Surp:HugePages_Total减去/proc/sys/vm/nr_hugepages中的值
5.挂载大页
内存只有被挂载了之后,才能被应用程序使用。到刚创建的huge目录下,挂载hugetlbfs文件系统。
sudo mount -t hugetlbfs nodev /mnt/huge
mount |tail -1
//nodev on /mnt/huge type hugetlbfs (rw,relatime,pagesize=2M)
6.使用sysctl(sysctl命令用于设置和显示在/proc/sys目录中的内核参数)命令设置vm.nr_hugepages,将大页个数设置为200(200 * 2M=400M,需要确保宿主机有足够可以分配的内存)。
sudo sysctl vm.nr_hugepages=200
//vm.nr_hugepages = 200
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
HugePages_Total: 200
HugePages_Free: 200
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
7.大页内存挂载
mkdir /mnt/huge
sudo mount -t hugetlbfs pagesize=1GB /mnt/huge
通过在/etc/fstab文件中添加以下行,可以使挂载点在重新引导期间永久存在:
sudo vim /etc/fstab
uname -r
#4.15.0-29-generic
ldd --version
升级glibc 需要2.7版本 目前为2.27
wget http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.gz
tar -zxvf glibc-2.7.tar.gz
../glibc-2.7/configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
配置configure时出现错误
These critical programs are missing or too old: as ld gcc make *** Check the INSTALL file for required versions
wget http://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.gz
目前用不上,暂时不用管了
tar xJf dpdk-20.11.1.tar.xz
cd dpdk-stable-20.11.1
DPDK源文件由几个目录组成:
lib: DPDK 库文件
drivers: DPDK 轮询驱动源文件
app: DPDK 应用程序 (自动测试)源文件
examples: DPDK 应用例程
config, buildtools, mk: 框架相关的makefile、脚本及配置文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210520100037122.png
DPDK可以配置,构建并安装使用的工具在系统上 meson和ninja。
meson <options> build
出现错误
The Meson build system
Version: 0.45.1
Source dir: /home/dpdk-stable-20.11.1
Build dir: /home/dpdk-stable-20.11.1/build
Build type: native build
Program cat found: YES (/bin/cat)
meson.build:4:0: ERROR: Meson version is 0.45.1 but project requires >= 0.47.1.
A full log can be found at /home/dpdk-stable-20.11.1/build/meson-logs/meson-log.txt
修改方法:
pip3 install --user meson
//可以安装最新版,但是version还是显示以前低版本的
继续搜索发现pip3会将软件安装到/home/user/.local/bin
而系统默认是使用/usr/bin/meson
所以通过修改path路径使得pip安装的meson优先于系统meson被搜索到
export PATH=~/.local/bin:$PATH
配置完成后,即可构建并安装DPDK,并在系统范围内使用:
cd build
ninja
//[2415/2415] Linking target app/test/dpdk-test
sudo ninja install
sudo ldconfig
build/app/dpdk-testpmd -c7 --vdev=net_pcap0,iface=eth0 --vdev=net_pcap1,iface=eth1 -- -i --nb-cores=2 --nb-ports=2 --total-num-mbufs=2048
不同的PMD可能需要不同的内核驱动程序才能正常工作。根据所使用的PMD,应加载相应的内核驱动程序,并将网络端口绑定到该驱动程序。
sudo modprobe vfio-pci
在无法使用VFIO的情况下,可以使用其他驱动程序。在许多情况下,uio_pci_genericLinux内核中包含的标准模块可以替代VFIO。可以使用以下命令加载该模块:
sudo modprobe uio_pci_generic
作为替代方案,可以在存储库dpdk-kmods中找到uio_pci_generic该igb_uio模块。可以如下所示加载它:
sudo modprobe uio
sudo insmod igb_uio.ko
./usertools/dpdk-devbind.py --status
解绑
sudo ifconfig ens33 down
//要将设备eth1``04:00.1''绑定到uio_pci_generic驱动程序
./usertools/dpdk-devbind.py --bind=uio_pci_generic ens33
尝试用vfio-pic驱动,uio_pci_generic驱动绑定网卡,都失败,绑定不上,原因
Error: unbind failed for 0000:02:06.0 - Cannot open /sys/bus/pci/drivers/e1000/unbind
还没有找到合适的解决方法
想法:换igb_uio驱动
成功了!!!!
sudo ./usertools/dpdk-devbind.py --bind=igb_uio 0000:02:06.0
记得sudo!
#查询网卡的devid号
lspci -nn | grep Ethernet
02:01.0 Ethernet controller [0200]: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) [8086:100f] (rev 01)
02:06.0 Ethernet controller [0200]: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) [8086:100f] (rev 01)
#在dpdk代码中搜索此devid号,
grep --include=*.h -rn -e '100f'
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_reg.h:1274:#define NIG_REG_BRB0_OUT_EN 0x100f8
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_reg.h:2112:#define NIG_REG_XCM0_OUT_EN 0x100f0
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_reg.h:2114:#define NIG_REG_XCM1_OUT_EN 0x100f4
dpdk-stable-20.11.1/drivers/net/bnx2x/ecore_hsi.h:2669: #define SHMEM_AFEX_VERSION_MASK 0x100f
dpdk-stable-20.11.1/drivers/common/sfc_efx/base/efx_regs_mcdi.h:349:#define MC_CMD_ERR_NO_MAC_ADDR 0x100f
是Intel支持的一种虚拟网卡,可以绑定的!
官网给的下载地址http://git.dpdk.org/dpdk-kmods
make
sudo apt install libelf-dev
make
./helloworld
EAL: Detected 1 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: Invalid NUMA socket, default to 0
EAL: No legacy callbacks, legacy socket not created
hello from core 0
sudo apt-get install pkg-config
EAL: Detected 1 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /run/user/1000/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
EAL: No available hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: Couldn't get fd on hugepage file
EAL: error allocating rte services array
EAL: FATAL: rte_service_init() failed
EAL: rte_service_init() failed
PANIC in main():
Cannot init EAL
5: [./helloworld(+0x84a) [0x55ee64f0e84a]]
4: [/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xe7) [0x7f5b64996bf7]]
3: [./helloworld(+0x818) [0x55ee64f0e818]]
2: [/usr/local/lib/x86_64-linux-gnu/librte_eal.so.21(__rte_panic+0xc5) [0x7f5b64d72285]]
1: [/usr/local/lib/x86_64-linux-gnu/librte_eal.so.21(rte_dump_stack+0x2e) [0x7f5b64d9445e]]
已放弃 (核心已转储)