DPDK 21.11.0-rc2 环境配置以及测试

本文主要参考两篇博客以及开发文档,原文链接如下:

DPDK在ubuntu20.04上的安装_一旦9912的博客-CSDN博客

DPDK使用hugepage原理总结_shaoyunzhe的专栏-CSDN博客

https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt

DPDK的安装

1. 获取源码(通过git)

git clone git://dpdk.org/dpdk # Get DPDK

git clone http://dpdk.org/git/dpdk-kmods # Get igb_uio

 

cp -r ./dpdk-kmods/linux/igb_uio ./dpdk/kernel/linux/ # Copy dpdk-kmods/linux/igb_uio/ to dpdk/kernel/linux/

 2. 配置文件

vim dpdk/kernel/linux/meson.build
将subdirs = ['kni'] 修改为 subdirs = ['kni', 'igb_uio']

vim dpdk/kernel/linux/igb_uio/meson.build

加入如下内容:

# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2017 Intel Corporation
mkfile = custom_target('igb_uio_makefile',
output: 'Makefile',
command: ['touch', '@OUTPUT@'])
custom_target('igb_uio',
input: ['igb_uio.c', 'Kbuild'],
output: 'igb_uio.ko',
command: ['make', '-C', kernel_dir + '/build',
'M=' + meson.current_build_dir(),
'src=' + meson.current_source_dir(),
'EXTRA_CFLAGS=-I' + meson.current_source_dir() +
'/../../../lib/librte_eal/include',
'modules'],
depends: mkfile,
install: true,
install_dir: kernel_dir + '/extra/dpdk',
build_by_default: get_option('enable_kmods'))

 3. 配置环境

apt-get install python3 python3-pip

pip3 install meson ninja pwntools

 

cd dpdk

sudo meson -D examples=all build

cd build

ninja install

 4. 配置巨页

如果只需要跑通dpdk-helloword,则可跳过本节,直接看第5节,在运行时加上“--no-huge”

临时配置 64个2MB巨页

echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

注意可能不具有nr_hugepages的写权限

可以先利用 chmod 777 修改该文件权限,接着再运行echo 即可

sudo chmod 777 /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

 如果由多个NUMA节点,可分别预设巨页,只需修改node0 → node1

 临时配置 2个1GB巨页

方法类似配置2MB的巨页,修改权限,再echo,hugepages-1048576kB对应1GB巨页

挂载巨页

默认挂载2MB的巨页

mkdir -p /mnt/hugepages

mount -t hugetlbfs nodev /mnt/hugepages #默认2MB

mount -t hugetlbfs nodev /mnt/huge_1GB -o pagesize=1GB #修改参数,可挂载1GB巨页

 5. 测试运行helloword

cd dpdk/build/examples

sudo ./dpdk-helloworld

./dpdk-helloworld --no-huge  #绕过配置巨页

每个物理核发送一个hello,如下图即运行成功

6. 常见错误 

运行时可能会出现权限不够的情况,出现以下错误,运行前加“sudo”即可

未配置1GB巨页,参照第4节

 巨页已配置,但未挂载,参照第4节

7. 绑定网卡

#查看正在运行的网卡
inconfig

 

#利用dpdk-devbind查看网卡、绑定和解绑网卡
#dpdk-devbind.py在/dpdk/usertools路径中

sudo ./dpdk-devbind.py --status   #查看网卡信息

#加载uio_pci_generic
sudo modprobe uio_pci_generic

#再次查看status,可以看到网卡支持uio_pci_generic

 

#绑定网卡,可直接输入待绑定网卡的名字或者地址
sudo ./usetools/dpdk-devbind.py --bind=uio_pci_generic ens6f0
#或者
sudo ./usetools/dpdk-devbind.py --bind=uio_pci_generic b1:00.0

#释放网卡, 需要输入地址,输入ens6f0会报错
sudo ./usertools/dpdk-devbind.py --bind=ixgbe b1:00.0

### 关于DPDK 21.11中的哈希函数实现 DPDK (Data Plane Development Kit) 是一种高性能的数据包处理库集合,广泛用于网络功能虚拟化(NFV)、路由器其他数据平面应用开发。在 DPDK 中,哈希函数被用来支持多种场景下的快速查找分布操作。 #### 哈希函数概述 DPDK 提供了一组通用的哈希算法接口来满足不同应用场景的需求。这些哈希函数通常位于 `lib/librte_hash` 其他相关模块中。对于 DPDK 21.11 版本而言,其主要实现了以下几种类型的哈希函数: 1. **RTE_HASH**: 这是一个基于扩展线性表的高效哈希表实现[^3]。它允许通过键值存储检索对象指针,并提供了多核环境下的并发访问能力。 ```c struct rte_hash *rte_hash_create(const struct rte_hash_parameters *params); ``` 上述 API 定义了一个创建哈希实例的方法,其中参数结构体包含了诸如桶数量、密钥长度以及自定义哈希函数等配置选项。 2. **Jenkins Hash Function**: 被默认采用作为内部计算逻辑的一部分,在许多情况下提供良好的性能表现同时保持简单易懂的设计思路[^4]。 Jenkins hash 函数具有较好的均匀性速度特性,适用于大多数常规用途。具体实现在源码路径下可以找到如下文件夹位置: ``` lib/librte_eal/common/include/generic/rte_jhash.h ``` 3. **Customizable Functions via Parameters**: 用户也可以指定自己的哈希方法代替内置方案。这使得开发者能够针对特定需求优化散列行为或者兼容已有系统设计模式[^5]。 #### 实现细节分析 - **Key-Length Flexibility**: 支持可变大小的关键字输入,这意味着无论是固定还是动态尺寸的数据都可以顺利参与运算过程而无需额外转换步骤[^6]。 - **Multi-Core Support & Lockless Design**: 鉴于现代服务器架构特点,整个框架特别强调无锁机制以减少跨CPU通信开销并提升整体吞吐量水平[^7]。 以下是简单的代码片段展示如何初始化一个带有定制化设置的新哈希表实例: ```c #include <rte_hash.h> struct rte_hash_parameters params = { .name = "example_hash", .entries = 1024, .key_len = sizeof(uint32_t), .hash_func = rte_jhash, /* Use default jenkins hash */ }; struct rte_hash *h; h = rte_hash_create(&params); if (!h){ printf("Failed to create hash\n"); } else{ printf("Hash created successfully.\n"); } ``` 以上程序段展示了基本构建流程,实际部署过程中可能还需要考虑更多边界条件及错误处理措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值