ExaGear内安装DPDK
发表于 2025/09/23
0
作者 | 朱勇
1 简介
ExaGear是一款二进制指令动态翻译软件,运行在Arm64服务器上,通过将x86的指令在运行时翻译为Arm64指令并执行,使得绝大部分x86应用无需重新编译就可运行在Arm64服务器上,实现低成本、快速迁移x86应用到Arm64服务器。
DPDK(Data Plane Develop Kit)数据平面开发工具包,是Intel开发的用于网络数据包加速的开发套件。它将传统的网卡收到数据包通过内核态处理的流程转移到了用户态处理,减少了CPU处理中断和上下文切换额外开销,能够使CPU得到更高效的利用。
当某些基于DPDK开发的软件找不到源码进行适配时,就需要通过ExaGear来进行转码运行,此时需先验证DPDK在ExaGear环境内是否可用,可以通过此文档参考DPDK在ExaGear的安装步骤。
2 环境要求
在ExaGear内安装DPDK,已验证的软硬件环境要求如表2-1所示。
表2-1 环境要求
项目 |
要求 |
---|---|
服务器 |
鲲鹏服务器 |
CPU配置 |
鲲鹏920 7260处理器(64核*2) |
内存配置 |
32GB,2933*16 |
操作系统 |
Kylin V10 SP3 |
网卡 |
Mellanox CX6 |
ExaGear |
4.2.0 |
DPDK |
20.11.9 |
Kylin V10 SP3操作系统默认为64KB pagesize内核,而ExaGear只能安装在4KB pagesize的内核上,因此需联系Kylin侧提供4KB内核安装包,在操作系统上安装好4KB内核后重启系统,进入4KB pagesize的内核。安装好4KB内核后可以根据以下步骤启用新内核。
内核修改为4KB pagesize后,需重新安装网卡驱动。
步骤 1 查看当前默认启动的内核。
grub2-editenv list
步骤 2 查看所有内核。
cat /boot/efi/EFI/kylin/grub.cfg | egrep "menuentry"
步骤 3 设置默认启动内核,设置后需重启服务器后生效。
grub2-set-default "Kylin Linux Advanced Server (4.19.90-52.39.v2207.ky10.aarch64+4k) V10 (Halberd)"
步骤 4 重启服务器后使用uname -a和getconf PAGESIZE命令查看当前系统内核和pagesize大小。
3 安装ExaGear
本节仅提供了ExaGear安装的关键步骤,详细的安装要求和安装操作请参见《ExaGear用户指南》。
前提条件
Kylin V10 SP3操作系统默认为64KB pagesize内核,而ExaGear只能安装在4KB pagesize的内核上,因此需联系Kylin侧提供4KB内核安装包,在操作系统上安装好4KB内核后重启系统,进入4KB pagesize的内核。具体操作请参见2 环境要求。安装ExaGear
步骤 1 下载安装ExaGear。wget https://mirrors.huaweicloud.com/kunpeng/archive/ExaGear/ExaGear_4.2.0.tar.gz
wget https://mirrors.huaweicloud.com/kunpeng/archive/ExaGear/prebuilt_GuestOS/ExaGear_GuestOS_CentOS7_1.0.tar.gz
tar -xf ExaGear_4.2.0.tar.gz
tar -xf ExaGear_GuestOS_CentOS7_1.0.tar.gz
mv exagear-guest-for-centos-7-x86_64-2793-1.noarch.rpm ExaGear_Server_for_Centos7
cd ExaGear_Server_for_Centos7/
yum install ./*.rpm
步骤 2 安装完成后执行exagear命令即可进入ExaGear环境。
4 在ExaGear内安装DPDK
4.1 配置ExaGear内Yum源
由于CentOS7自带的Yum源已经不可用了,需要用户自行配置可用的Yum源。本节以配置华为云Yum源为例。
步骤 1 配置华为云的Yum源。
1. 备份原始Yum源。
mv /etc/yum.repos.d /etc/yum.repos.d.bak
2. 进入配置文件所在目录。
mkdir /etc/yum.repos.d
3. 配置Yum源。
cat > /etc/yum.repos.d/centos71.repo <<EOF
[base]
name=CentOS-$releasever - Base - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos-vault/7.9.2009/os/$basearch/
gpgkey=https://repo.huaweicloud.com/centos-vault/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-$releasever - Updates - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos-vault/7.9.2009/updates/$basearch/
gpgkey=https://repo.huaweicloud.com/centos-vault/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever - Extras - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos-vault/7.9.2009/extras/$basearch/
gpgkey=https://repo.huaweicloud.com/centos-vault/RPM-GPG-KEY-CentOS-7
[centosplus]
name=CentOS-$releasever - Plus - repo.huaweicloud.com
baseurl=https://repo.huaweicloud.com/centos-vault/7.9.2009/centosplus/$basearch/
enabled=0
gpgkey=https://repo.huaweicloud.com/centos-vault/RPM-GPG-KEY-CentOS-7EOF
EOF
步骤 2 刷新Yum源缓存。
yum clean all
yum makecache
4.2 安装依赖
本节提供了在ExaGear环境中安装一系列开发工具和库的详细步骤,包括numactl、libpcap-devel、cmake、python3、pip、meson、ninja、gcc-7.3、make和glibc-2.28。每个工具的安装过程涉及使用yum包管理器、wget下载源码包、编译安装以及环境变量的配置。
步骤 1 执行exagear命令进入ExaGear环境,以下依赖均在ExaGear内安装。
步骤 2 安装依赖包。
cd /opt
yum install -y numactl numactl-devel libpcap-delvel cmake python3
步骤 3 升级pip。
1. 下载源码包。
wget https://files.pythonhosted.org/packages/da/f6/c83229dcc3635cdeb51874184241a9508ada15d8baa337a41093fab58011/pip-21.3.1.tar.gz
2. 解压源码包。
tar -xf pip-21.3.1.tar.gz
3. 进入解压后目录。
cd pip-21.3.1
4. 升级pip。
python3 setup.py install
5. 查看pip版本,确认是否升级成功。
pip --version
步骤 4 安装meson和ninja。
1. 获取源码包。
wget https://files.pythonhosted.org/packages/18/db/3feb3cfa102553b9329d0c887b3c10480381de69abf6e8629f6b32f450df/meson-0.61.5-py3-none-any.whl
wget https://files.pythonhosted.org/packages/e7/cc/758334e96fd614ff226490277eaae36db778b69c486b6c5df575f5ab74e4/ninja-1.11.1-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
2. 安装meson。
pip install meson-0.61.5-py3-none-any.whl
3. 安装ninja。
pip install ninja-1.11.1-py2.py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
步骤 5 安装GCC。
1. 配置Yum源。
cat > /etc/yum.repos.d/centos-sclo-sclo <<EOF
name=CentOS-7 - SCLo sclo
baseurl=https://repo.huaweicloud.com/centos-vault/7.9.2009/sclo/$basearch/sclo/
gpgcheck=0
enabled=1
EOF
cat > /etc/yum.repos.d/centos-sclo-rh <<EOF
name=CentOS-7 - SCLo rh
baseurl=https://repo.huaweicloud.com/centos-vault/7.9.2009/sclo/$basearch/rh/
gpgcheck=0
enabled=1
yum clean all
yum makecache
2. 安装GCC。
yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
scl enable devtoolset-7 bash
3. 查看GCC版本,确认是否安装成功。
gcc -v
echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile
步骤 6 升级make。
1. 下载源码包。
wget https://ftp.gnu.org/gnu/make/make-4.3.tar.gz
2. 解压源码包。
tar -xf make-4.3.tar.gz
3. 进入解压后目录。
cd make-4.3/
4. 升级make。
./configure --prefix=/usr/local/make
make
make install
cd /usr/bin/
mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make
5. 查看make版本,确认是否升级成功。
make --version
步骤 7 升级glibc。
1. 下载源码包。
wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar -zxvf glibc-2.28.tar.gz
cd glibc-2.28
mkdir glibc228
cd glibc228
/home/glibc-2.28/configure --prefix=/usr/local/glibc-2.28
make -j
make -j install
export PATH=/usr/local/glibc-2.28/bin:$PATH
2. 解压源码包。
tar -zxvf glibc-2.28.tar.gz
3. 进入解压后目录。
cd glibc-2.28
4. 升级glibc。
mkdir glibc228
cd glibc228
/home/glibc-2.28/configure --prefix=/usr/local/glibc-2.28
make -j
make -j install
export PATH=/usr/local/glibc-2.28/bin:$PATH
5. 查看glibc版本,确认是否升级成功。
ldd --version
4.3 安装Mellanox网卡驱动
由于ExaGear内只能运行用户态的内容,当需要进入内核态时都是直接透传给ExaGear所在的宿主机的,因此需在宿主机和ExaGear内都安装网卡驱动。
在宿主机上执行exagear命令可以进入ExaGear环境,在ExaGear环境内执行exit可以返回到宿主机环境。
在宿主机上内安装网卡驱动
步骤 1 下载网卡驱动。
此处以23.07-0.5.0.0版本为例,在宿主机上下载Arm版本的驱动源码包。
步骤 2 下载解压后,执行./install.pl命令进入驱动安装菜单。
步骤 3 选择“Basic”进行安装,等待一段时间后安装完成。
步骤 4 如有提示需要安装相关依赖包,则先安装所提示的依赖包后再重新执行以上步骤。
步骤 5 安装完毕后,执行dracut -f命令,重启后新驱动系统生效。
步骤 6 驱动安装完毕后,可以使用ethtool -i <eth_device>命令查看网卡驱动版本,回显信息中的第一行和第二行即为驱动名称和版本。
在ExaGear内安装网卡驱动
步骤 1 在宿主机上安装好驱动后,下载x86版本的网卡驱动安装包并上传到ExaGear内,ExaGear内的“/opt”目录对应宿主机的“/opt/exagear/images/centos-7-x86_64/opt/”目录。
步骤 2 下载解压后,执行以下命令安装网卡驱动。
./mlnxofedinstall --skip-distro-check --hpc --skip-kmp-verify --user-space-only
步骤 3 如有提示需要安装相关依赖包,则先安装所提示的依赖包后再重新执行以上步骤。
4.4 安装DPDK
步骤 1 在ExaGear内执行以下命令安装dpdk-20.11.9。
wget http://fast.dpdk.org/rel/dpdk-20.11.9.tar.xz
tar -xf dpdk-20.11.9.tar.xz
cd dpdk-stable-20.11.9/
meson setup build
ninja -C build -j 32
ninja -C build install
ldconfig
步骤 2 使用testpmd验证是否可用。
dpdk-testpmd -l 2-11 -n 4 -- -i --rxq=1 --txq=1 --rxd=4096 --txd=4096 --nb-cores=2 --burst=64 --mbuf-size=2048 --total-num-mbufs=20480 --mbcache=512
5 DPDK测试及调优
BIOS调优
对于不同的硬件设备,通过在BIOS中设置一些高级选项,可以有效提升服务器性能。重启服务器后,进入BIOS设置界面,并设置如表5-1所示的选项。
如何进入BIOS界面的具体操作请参见《TaiShan 服务器 BIOS 参数参考(鲲鹏920处理器)》中“进入BIOS界面”的相关内容。
表5-1 配置BIOS
选项 |
设置值 |
设置方法 |
---|---|---|
Power Policy,设置CPU为性能模式,提高主频,发挥CPU最大性能。 |
Performance |
依次选择“Advanced > Performance Config > Power Policy”,将“Power Policy”修改为“Performance”。 |
Custom Refresh Rate,自定义内存刷新速率。 |
32ms |
依次选择“Advanced > Memory Config > Custom Refresh Rate”,将内存刷新频率调至32ms。 |
CPU Prefetch Configuration,关闭CPU预取,防止其对性能造成影响。 |
Disabled |
依次进入“Advanced > MISC Config > CPU Prefetching Configuration”,将“CPU Prefetching Configuration”设置为“Disabled”。 |
操作系统调优
步骤 1 修改“/boot/efi/EFI/openEuler/grub.cfg”文件,在对应menuenty的linux开头行末尾添加如下参数并重启生效。
isolcpus=0-31 nohz_full=0-31 rcu_nocbs=0-31 iommu=pt ro default_hugepagesz=1G hugepagesz=1G hugepages=80 rcu_nocb_poll audit=0
步骤 2 网卡参数优化。
ethtool -A ethx ex off tx off
sysctl -w vm.zone_reclaim_mode=0
sysctl -w vm.swappiness=0
步骤 3 先查询setpci -s 01:00.1 68.w得到结果ABCD,然后修改设置:setpci -s 01:00.1 68.w=3BCD(只将结果中的第一位修改为3)。
mlxconfig -d 01:00.1 set CQE_COMPRESSION=1
步骤 4 重启服务器使配置生效。
echo -1 > /proc/sys/kernel/sched_rt_runtime_us
步骤 5 调整网卡中断,将网卡中断绑定在最远的numa node。
网卡中断绑核的具体操作请参见《Percona调优指南》中“网卡中断绑核”章节内容。
步骤 6 使用dpdk-testpmd命令启动DPDK的测试工具testpmd,用于测试和调试DPDK驱动、网卡性能及数据包转发能力。测试命令如下:
单口:
dpdk-testpmd -a 01:00.1 -l 1-31 --socket-mem=20480,0,0,0 -- -i --rss-ip --nb-cores=16 --rxq=16 --txq=16 --rxd=2048 --txd=2048 --mbuf-size=2048 --mbcache=512 --port-topology=loop --burst=64 --forward-mode=io --auto-start
双口:
dpdk-testpmd -a 01:00.1 -a 01:00.0 -l 1-31 --socket-mem=20480,0,0,0 -- -i --rss-ip --nb-cores=16 --rxq=16 --txq=16 --rxd=2048 --txd=2048 --mbuf-size=2048 --mbcache=512 --port-topology=loop --burst=64 --forward-mode=io --auto-start
参数说明如表5-2所示。
表5-2 dpdk-testpmd命令参数说明
类别 |
参数 |
说明 |
---|---|---|
DPDK环境参数 |
-a |
指定要绑定到DPDK驱动的网卡PCIe地址。 |
-l |
分配给DPDK应用的CPU核心列表,这里指定核心1到31(共 31 个核心)。 | |
--socket-mem |
为不同NUMA节点分配的大页内存。 | |
testpmd应用参数 |
-i |
启动交互模式,允许在运行中通过命令行输入指令(如修改转发模式、查看统计信息等)。 |
--rss-ip |
启用基于IP地址的RSS(Receive Side Scaling),让网卡根据IP地址对数据包进行哈希计算,分发到不同的接收队列(RX Queue),实现多队列负载均衡。 | |
--nb-cores |
指定用于数据包处理的核心数量,这些核心会与接收队列(RX Queue)绑定,负责处理对应队列的数据包。 | |
--rxq |
为每个端口配置接收队列数量(RX Queue)。多队列可配合RSS或手动分配,提升并行处理能力。 | |
-txq |
为每个端口配置发送队列数量(TX Queue)。与接收队列对应,通常数量与接收队列(RX Queue)一致,实现收发队列一一对应。 | |
--rxd |
每个接收队列的描述符数量。描述符用于网卡与DPDK应用之间传递数据包信息,数量需根据场景调整,配置过大占用内存,过小可能导致丢包。 | |
--txd |
每个发送队列的描述符数量,作用类似--rxd。 | |
--mbuf-size |
配置数据包缓冲区(mbuf)的大小。mbuf用于存储数据包内容,大小需大于最大接收包长度(如MTU=1500时,设置为2048是足够的)。 | |
--mbcache |
每个核心的mbuf缓存池大小。缓存池用于快速分配或释放mbuf,减少内存操作开销。 | |
--port-topology |
配置端口拓扑为 “环回模式”(loopback)。无需物理网线连接,发送的数据包会被网卡自身环回接收,用于单机测试。 | |
--burst |
每次从队列中批量处理的数据包数量。批量处理可提升效率,减少函数调用开销,数值需根据硬件性能调整。 | |
--forward-mode |
设置转发模式为 “I/O 转发”(IO forwarding)。即从接收队列(RX Queue)读取数据包后,直接通过发送队列(TX Queue)转发,不做任何修改。 | |
--auto-start |
testpmd启动后自动开始转发数据包,无需手动输入start命令。 |