一、状态查询
grep -i HugePages_Total /proc/meminfo 查询是否启动大页
mount |grep hugetlbfs 查看是否挂载了 hugetlbfs
cat /proc/meminfo |grep Huge 查询大页是否配置
二、初始配置
设置虚拟机增加2个网卡,启动cpu虚拟化和IOMMU(若使用虚机)
apt install meson ninja-build build-essential python3-pip
apt install python3-pyelftools
lscpu 查看cpu\numa\socket信息 (numastat)
也可以使用dpdk脚本查看 python3 cpu_layout.py -s
cat /proc/cpuinfo |grep --color pse 查看是否支持2M大页
cat /proc/cpuinfo |grep --color pdpe1gb查看是否支持1G大页
我们已经知道, 为系统分配大页内存有两种大小:
2M 和 1G
1G的只有64位系统支持, 并且我们推荐64位的操作系统尽量使用1G的page
同时, 我们还知道配置大页内存,有两个时机
boot time 和 run time
boot time的配置写在grub里,给内核.
2.1 2M大页:(配置512*2M)
a、run time时生效
numa架构:
node0节点:echo 256 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
node1节点:echo 256 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
非numa:echo 512 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
这种配置方式的优点是配置简单,无需编译、重启,但是无法配置1GB这样的大hugepages
b、boot time生效(推荐)
1、修改文件
修改/etc/default/grub
文件,在GRUB_CMDLINE_LINUX
中加入如下配置:
hugepages=1024 (1024*2M)
default_hugepagesz=2M hugepagesz=2M hugepages=1024
2、编译配置文件 grub2-mkconfig -o /boot/grub2/grub.cfg
3、重启 reboot
cat /proc/meminfo | grep Huge 查看大页是否设置成功
也可以使用dpdk脚本查看python3 dpdk-hugepages.py -s
mkdir /mnt/huge && mount -t hugetlbfs nodev /mnt/huge 临时挂载使用大页
echo “nodev /mnt/huge hugetlbfs defaults 0 0” >> /etc/fstab 永久挂载使用大页
2.2 1G大页:
1G大页内存,需要libhugetlbfs
库的支持,如果设置2MB的据说不需要
apt install libhugetlbfs
a、boot time生效
1、修改文件
修改/etc/default/grub
文件,在GRUB_CMDLINE_LINUX
中加入如下配置:
default_hugepagesz=1G hugepagesz=1G hugepages=4
该配置表示默认的hugepages的大小为1G,设置的hugepages大小为1G,hugepages的页数为4页,即以4个1G页面的形式保留4G的hugepages内存
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap default_hugepagesz=1G hugepagesz=1G hugepages=4 rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
2、编译配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
3、重启
通过reboot
命令重启,随后可以通过cat /proc/cmdline
查看kernel的command line是否包含之前的配置。
4、挂载
mkdir /mnt/huge_1GB && mount -t hugetlbfs pagesize=1GB /mnt/ huge_1GB 临时挂载使用大页
echo “nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0” >> /etc/fstab 永久挂载使用大页
添加上面这样一行内容至/etc/fstab
后并重启,可以通过df -a
看到挂载成功:
nodev 0 0 0 - /mnt/huge_1GB
这种配置方式的优点是可以在系统开机时即配置预留好hugepages,避免系统运行起来后产生内存碎片;另外,对于较大的例如1G pages,是不支持在系统运行起来后配置的,只能通过kernel cmdline的方式进行配置。对于双插槽的NUMA系统(dual-socket NUMA system),预留的hugepages会被均分至两个socket。
三、编译安装
mkdir build 创建外部编译目录
meson -Dbuildtype=debug -Dexamples=ALL -Denable_kmods=true build
???meson configure -Dexamples=All build -Dprefix=`pwd`/x86_64-native-linuxapp-gcc
编译问题解决:
buildtools/meson.build:45:8: ERROR: Problem encountered: missing python module: elftools
pip install pyelftools --upgrade
pip3 install pyelftools –upgrade
ninja -C build install
???cd build&&ninja install
ldconfig 刷新ldd链接
Ps:执行完之后所有的库都安装在 /usr/local/lib/x86_64-linux-gnu/ 目录。可执行程序和脚本都安装在 /usr/local/bin/ 目录。卸载只需执行 ninja uninstall 即可。至此环境安装完成。
编译DPDK应用:cd /usr/local/share/dpdk/examples + make
四、内核驱动安装
1、如果使用uio,需要加载uio_pci_generic
(系统默认、不支持VF设备)
2、如果使用vfio,需要加载vfio
(系统默认)和vfio-pci
(系统默认)
3、如果使用igb_uio,需要加载uio
(系统默认)和igb_uio
(编译得到)。但是新版本的dpdk不再使用igb_uio
(虽然还可以打开配置进行编译)。
git clone http://dpdk.org/git/dpdk-kmods
cd dpdk-kmods/linux/igb_uio
make
cd dpdk-kmods/linux/igb_uio
modprobe uio智能加载原有uio驱动
insmod igb_uio.ko intr_mode=legacy 加载驱动时要带着参数intr_mode=legacy,如果不加参数,将会有问题!
rmmod igb_uio.ko 卸载驱动
五、dpdk网卡接管
为接管前ethtool和ifconfig都可以查看网卡状态。最好记住网卡名和编号之间的关系。
DPDK网卡绑定
ifconfig ens38 down
python3 dpdk-devbind.py -b igb_uio ens38
???python3 dpdk-devbind.py --bind=vfio-pci ens38 ( vfio-pci需要支持IOMMU)
查看网卡状态
dpdk-devbind.py –status
解绑网卡
网卡 ens38被 DPDK 占用后,ifconfig 里就没有了,使用 lspci | grep Eth查看网卡
//解绑两个网卡的 igb_uio 驱动,绑定 e1000 驱动:
dpdk-devbind.py -u 0000:02:06.0
dpdk-devbind.py -b e1000 02:06.0
//启动网卡
#ifconfig ens38 up