dpdk:vfio-pci模式下iommu(N+Y)-Huge配置-numa配置
DPDK大内存页Hugepages配置:
Hugepages是DPDK用于提升性能的重要手段。 通过使用Hugepages,可以降低内存页数,减少TLB页表数量,增加TLB hit率。
在Linux上设置Hugepages有两种方式:
- 修改Kernel cmdline(推荐)
- 修改sysfs节点
1. 系统一般都支持大页内存,目前大部分都是将2M作为默认配置页,使用默认大页配置,设置巨页
分配巨页1024*2M=2G并查看大页分配数目
echo 2048 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
cat /proc/meminfo| grep Huge
对于2 MB页面,还可以选择在系统启动后进行分配。 这是通过修改 /sys/devices/
中的nr_hugepages
节点来实现的。 对于单节点系统,若需要1024个页面,可使用如下命令:
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
在NUMA机器上,页面的需要明确分配在不同的node上(若只有一个node只需要分配一次):
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
这种配置方式的优点是配置简单,无需编译、重启,但是无法配置1GB这样的大hugepages。
2. 启用1G内存页,一般64位机器均推荐1G大内存页,启用方式如下:
通过修改kernel command line可以在kernel初始化时传入Hugepages相关参数并进行配置。
具体的操作步骤如下:
- 修改grub文件
修改/etc/default/grub
文件,在GRUB_CMDLINE_LINUX
中加入如下配置:default_hugepagesz=1G hugepagesz=1G hugepages=4
该配置表示默认的hugepages的大小为1G,设置的hugepages大小为1G,hugepages的页数为4页,即以4个1G页面的形式保留4G的hugepages内存
修改后的grub文件示例如下: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"
- 编译grub配置文件
可以通过命令grub2-mkconfig -o /boot/grub2/grub.cfg
- 重启
通过reboot
命令重启,随后可以通过cat /proc/cmdline
查看kernel的command line是否包含之前的配置。
也可以通过cat /proc/meminfo | grep Huge
命令查看是否设置成功,若设置成功可以看到如下配置:HugePages_Total: 4HugePages_Free: 4Hugepagesize: 1048576 kB
DPDK官方建议,64位的应用应配置1GB hugepages。
这种配置方式的优点是可以在系统开机时即配置预留好hugepages,避免系统运行起来后产生内存碎片;另外,对于较大的例如1G pages,是不支持在系统运行起来后配置的,只能通过kernel cmdline的方式进行配置。
注:对于双插槽的NUMA系统(dual-socket NUMA system),预留的hugepages会被均分至两个socket,可以通过lscpu
查看CPU信息:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
socket(s): 1
NUMA node(s): 1
可见测试主机使用的是单socket的NUMA系统。DPDK使用Hugepages
预留好Hugepages之后,想要让DPDK使用预留的Hugepages,需要进行下述操作:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
可以将这个挂载点添加到/etc/fstab
中,这样可以永久生效,即重启后也仍然可以生效:
nodev /mnt/huge hugetlbfs defaults 0 0
对于1GB pages,在/etc/fstab
中必须指定page size作为mount选项。
nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
添加上面这样一行内容至/etc/fstab
后并重启,可以通过df -a
看到挂载成功:
nodev 0 0 0 - /mnt/huge_1GB
===========================DPDK驱动VFIO-PCI==============================
DPDK 驱动加载有三种方式:
uio、vfio-pci+iommu禁用、vfio+iommu启用
不同的PMD需要不同的内核驱动程序才能正常工作。 取决于正在使用的PMD,应加载相应的内核驱动程序并绑定到网络端口。
一、 UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即可。
而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能。
在许多情况下,Linux内核中包含的标准uio_pci_generic模块可以提供uio功能。 可以使用以下命令加载此模块:
sudo modprobe uio_pci_generic
除了Linux内核中包含的标准uio_pci_generic模块,DPDK也提供了一个可替代的igb_uio模块,可以在kmod
路径中找到。可以通过以下方法加载igb_uio模块。
sudo modprobe uio
sudo insmod kmod/igb_uio.ko
如果用于DPDK的设备绑定为uio_pci_generic内核模块,需要确保IOMMU已禁用或passthrough。 以intel x86_64系统为例,可以在的GRUB_CMDLINE_LINUX
中添加intel_iommu = off
或intel_iommu = on iommu = pt
。
2、 l2fwd运行绑定网卡方式:(启用vfio-pci、iommu禁用)
PS:以挂载ens7 网卡,pci 0000:02:05.0 为例
1. 关闭计划用dpdk接管的网卡接口,并查询其pci端口号,可以通过lspci |grep Ethernet
查看。此时需要确认本机物理网卡或虚拟网卡为DPDK支持类型,查询网址https://core.dpdk.org/supported/
ifconfig ens37 down
2. 安装NIC网卡驱动模块并启动非安全NOIOMMU模式
modprobe vfio-pci
echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
注意事项:
如果,发现dpdk 没有挂载上网卡那请手动绑定一下,手动执行在第2步之后
/opt/vpp/external/x86_64/share/dpdk/usertools/dpdk-devbind.py --bind=vfio-pci 0000:02:05.0
三、 l2fwd运行绑定网卡方式:(启用vfio-pci、iommu启用)VFIO(推荐)
VFIO与UIO相比,它更加强大和安全,依赖于IOMMU。 要使用VFIO,需要:
- Linix kernel version>=3.6.0
- 内核和BIOS必须支持并配置为使用IO virtualization(例如Intel®VT-d)。
在确认硬件配置支持的情况下,要使用VFIO驱动绑定到NIC必须先使能iommu,否则会导致绑定失败。具体的现象就是查看或修改sysfs节点/sys/bus/pci/drivers/vfio-pci/bind
出现io错误,以及dmesg中出现:
vfio-pci: probe of 0000:05:00.0 failed with error -22
使能iommu的方法也是修改kernel的command line将iommu=pt intel_iommu=on
传入,具体步骤:
- 修改grub文件
修改/etc/default/grub
文件,在GRUB_CMDLINE_LINUX
中加入如下配置:iommu=pt intel_iommu=on
- 编译grub配置文件
可以通过命令grub2-mkconfig -o /boot/grub2/grub.cfg
- 重启
通过reboot
命令重启,随后可以通过cat /proc/cmdline
查看kernel的command line是否包含之前的配置。
iommu配置成功后,dmesg中会有iommu配置group的log,可以通过dmesg | grep iommu
查看:
[ 0.594500] iommu: Adding device 0000:05:00.0 to group 18
[ 0.594512] iommu: Adding device 0000:06:00.0 to group 19
即表示iommu使能成功。
随后需要调用modprobe
来加载VFIO的驱动:
sudo modprobe vfio-pci
驱动绑定NIC
上述的UIO和VFIO驱动可以加载一项,也可以全都加载。但是在驱动绑定NIC的时候,只能选择一种驱动绑定到NIC,这里采用VFIO驱动。
可以调用dpdk路径下的usertools/dpdk-devbind.py
实用脚本来进行VFIO驱动与NIC绑定,需要注意的是使用这个脚本进行绑定(bind)动作时是需要root权限的。
可以调用脚本传入--status
查看当前的网络端口的状态:
python usertools/dpdk-devbind.py --statusNetwork devices using kernel driver
===================================
0000:03:00.0 'I210 Gigabit Network Connection 1533' if=enp3s0 drv=igb unused=vfio-pci *Active*
0000:04:00.0 'I210 Gigabit Network Connection 1533' if=enp4s0 drv=igb unused=vfio-pci *Active*
0000:05:00.0 'I210 Gigabit Network Connection 1533' if=enp5s0 drv=igb unused=vfio-pci
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=vfio-pci
可以看到,当前NIC的状态都是Network devices using kernel driver
,使用的是kernel的igb驱动drv=igb
。
随后可以调用脚本传入--bind
将网卡05:00.0
,也就是enp5s0
绑定到VFIO驱动:
python usertools/dpdk-devbind.py --bind=vfio-pci 05:00.0
再次调用脚本传入--status
,可以看到:
Network devices using DPDK-compatible driver
============================================
0000:05:00.0 'I210 Gigabit Network Connection 1533' drv=vfio-pci unused=igbNetwork devices using kernel driver
===================================
0000:03:00.0 'I210 Gigabit Network Connection 1533' if=enp3s0 drv=igb unused=vfio-pci *Active*
0000:04:00.0 'I210 Gigabit Network Connection 1533' if=enp4s0 drv=igb unused=vfio-pci *Active*
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=vfio-pci
设备05:00.0
已经配置为drv=vfio-pci
,若想要恢复为kernel默认的igb驱动,则可以继续调用脚本:
python usertools/dpdk-devbind.py --bind=igb 05:00.0
至此,DPDK的部署就算完成了,接下来可以尝试编译和运行
基于DPDK的简单应用了。
基于DPDK的简单应用编译与运行方法可以查看:
==================启用numa编译选项===============================
又踩了一个坑,在编译启用numa时候,若直接编译,dpdk是启用不了numa的,需要安装一些基础库
yum install numactl
yum install numactl-libs
yum install numactl-devel
需要安装完上面这些库,才能编译出带numa的dpdk库
如上,若按照默认编译选项,则编译完成程序是没有启用numa的,若需要启用numa功能,需要在编译时加上编译选项:
编译时启用numa选项:
meson -DCONFIG_RTE_LIBRTE_VHOST_NUMA=y -Dexamples=all build
cd build
ninja
删掉原来编译后的库(对应的是pkgconfig的库)
find / -name libdpdk*
rm /usr/local/lib64/pkgconfig/libdpdk* -rf
重新install,生成相应库
ninja install
更新so库的目录,原来so库目录更新为新库目录
ldconfig
ldconfig -p
ldconfig -p|grep rte
ls -lah /usr/local/src/dpdk/dpdk-21.02/build/lib/librte_eventdev.so
cat /etc/ld.so.conf.d/dpdk-ling.conf
vim /etc/ld.so.conf.d/dpdk-ling.conf
ldconfig
确认so库目录是否更改成功
ldconfig -p |grep rtel2fwd编译:
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
meson build
cd build/
ninja
cat /proc/meminfo
lscpu
./l2fwd -l 0-9 -n 4 -- -q 1 -p 3
看是否还有numa未编译提示,应该是没有了
备注:
numa需要加深认识,留待以后详细了解,较好的文档如下:
ovs+dpdk numa感知特性验证:
https://blog.csdn.net/weixin_30478757/article/details/99426913结合使用带有Open vSwitch *的数据平面开发套件来创建vHost用户非统一内存访问意识:
https://software.intel.com/content/www/us/en/develop/articles/vhost-user-numa-awareness-in-open-vswitch-with-dpdk.html
dpdk:vfio-pci模式下iommu(N+Y)-Huge配置-numa配置相关推荐
- 玩转华为数据中心交换机系列 | 配置M-LAG维护模式下升级示例
素材来源:华为数据中心交换机配置指南 一边学习一边整理试验笔记,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:玩转华为数据中心交换机系列 | 汇总_COCOgsta的博客-CSDN博客 组网需求 如 ...
- DPDK内存篇(三): 标准大页、NUMA、DMA、IOMMU、IOVA、内存池
作者简介:Anatoly Burakov,英特尔软件工程师,目前在维护DPDK中的VFIO和内存子系统. 目录 引言 标准大页 将内存固定到NUMA节点 硬件.物理地址和直接内存存取(DMA) IOM ...
- 字符模式下构建、使用KVM虚拟化平台
字符模式下构建.使用KVM虚拟化平台 环境准备: KVM虚拟化服务器(真机或高配虚拟机(内存>4G) 操作系统:CentOS 6.5 ==> 关闭 iptables 防火墙.关闭SEL ...
- awstats CGI模式下动态生成页面缓慢的改进
本文可以看做是 多server多站点情况下awstats日志分析 这篇文章的下篇,在使用过程中发现awstats在cgi模式下动态生成分析报告慢的问题 (尤其是有些站点每天两个多G的日志,查看起来简直 ...
- vim介绍,vim颜色显示,vim一般模式下移动光标,vim一般模式下的复制、剪切和粘贴...
2019独角兽企业重金招聘Python工程师标准>>> vim介绍 vim是vi的升级版,相较于vi,会显示颜色. 如果系统没有vim工具,需要安装:# yum install -y ...
- bios x86保护模式下的软盘操作floppy
Cpu启动时,如果在bios中设置了从软盘启动,则bios会自动把软盘的第一个扇区(512字节)搬移到0x7c00,然后会从0x7c00开始运行,我们需要在这512字节的程序中实现把boot从软盘中搬 ...
- AES CBC模式下的CBC bit flipping Attack
<?xml version="1.0" encoding="utf-8"?> AES CBC模式下的CBC bit flipping Attack ...
- 调用支付jsapi缺少参数appid_服务商模式下的小程序微信支付
最近,要做一个小程序商城的项目,需要在小程序中用到分账功能,也就是顾客购买商品支付的钱要给各个店铺,这就需要用到服务商模式. 在谈服务商模式下小程序微信支付之前,我们先要有一个服务商的商户号,这个商户 ...
- timertask run函数未执行_图执行模式下的 TensorFlow 2
文 / 李锡涵,Google Developers Expert 本文节选自<简单粗暴 TensorFlow 2.0> 尽管 TensorFlow 2 建议以即时执行模式(Eager E ...
最新文章
- C#中抽象类和接口的区别
- 受精卵或非“生命起始”?网友:教材是不是要改了……
- C++语言程序设计之关联容器类型
- 微机原理换行代码_设置段落样式的标记中,用来换行的标记是:
- 已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为“名”+空格+“姓”;并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写。(后附详细样例说明)
- 【Linux/Ubuntu】查询文件和文件夹大小
- 函数hook注意事项
- tcpdump命令速查
- linux的基本的命令行操作
- 火狐浏览器不弹出窗口_Firefox选项卡的Vista样式弹出窗口预览
- <Java>设计一个名为Fan的类
- 计算机二级office无法评分,计算机二级OFFICE评分标准
- 前端js实现文字自动转拼音方法
- kali使用笔记本自带无线网卡_生活日常(教你笔记本电脑如何正确使用WiFi)
- 长安大学微型计算机原理与接口技术答案,长安大学考研专业课《815微机原理与接口技术》真题解析 考点 冲刺.pdf...
- 数据库课程设计——学生选课管理信息系统
- vue在created调用点击方法_vue.js中created方法的使用详解
- 网络综合布线系统的概述
- 理论力学专题:分析力学
- 装配连接示意图-萨姆森3730-4型PROFIBUS-PA数字式电气阀门定位器
热门文章
- glib linux,[转载]linux下glib.h的介绍
- 2021年的EI会议论文发表难度评价
- java计算机毕业设计吉他库存管理源码+mysql数据库+系统+lw文档+部署
- AF_XDP socket 测试
- Oracle 考试题 答案
- 计算机课有平时成绩吗,大学计算机基础课程平时成绩评定方法探究.doc
- 看《延禧攻略》学配色与构图
- 复制html代码怎么粘贴快捷键,电脑复制粘贴快捷键,教您电脑怎么用键盘复制粘贴...
- JavaSE Lambda 表达式
- matlab 稳定系统,matlab分析系统的稳定性