DPDK基础
EAL参数
逻辑线程相关参数
-c
c参数后跟16进制数, 根据二进制位上是零还是一来决定是否启用该内核.
# 使用核心7
./helloworld -c 80
-l
l参数后跟范围来决定使用那些核心.
#使用核心0-3
./helloworld -l 0-3
--lcores
lcores参数提供CPU核心到EAL线程的多对多绑定, 可以实现EAL线程的伸缩扩展.
# 使用核心(0-3)映射0, (4-7)映射1.
./helloworld --lcores "0@(0-3),1@(4-7)"
# 使用核心(0-3)映射(0-15), (16-31)映射(4, 5, 6)
./helloworld --lcores "(0-15)@(0-3),(16-31)@(4,5,6)"
# 不指定具体分配的CPU核心时, 线程与核心一一对应
./helloworld --lcores "0-7"
以上三个参数只能使用其中一个.
lcores标志前有两个'-'字符.
lcores参数需要使用双引号包含.
--master-lcore
master-lcore参数指定EAL主线程使用那个CPU核心, 参数为CPU核心ID.
# 使用ID为3的核心作为EAL主线程
./helloworld --master-lcore 3
-s
s参数指定EAL服务线程使用的核心, 参数为16进制掩码.
# 使用3, 7核心为服务线程
./helloworld -s 88
设备相关参数
-b(--pci-blacklist)
b参数添加一个指定pci设备进黑名单, 参数为pci设备id.
-w(--pci-whitelist)
w参数添加一个指定pci设备进白名单, 参数为pci设备id.
b参数或w参数只能二选一, 但是可以多次使用即将多个设备放入PCI白/黑名单.
--vdev
vdev参数指定要添加的虚拟设备的参数.
参数需要使用双引号包含.
-d
d参数指定加载一个驱动文件或包含多个驱动的文件夹, 可以使用多次.
--no-pci
no-pci参数禁止使用pci总线.
多进程相关参数
dpdk进程中分为两类, 一类为主进程, 主进程初始化共享内存, 它具有对共享内存的完整权限; 另一类为辅助进程, 辅助进程不能初始化共享内存, 但可以使用主进程初始化的共享内存, 并在其中创建内存对象.
--proc-type
proc-type指定进程类型为主进程还是辅助进程, 参数有primary, secondary, auto.
--file-prefix
允许非合作的进程拥有不同的内存区域.
存储相关参数
-n
n指定每个处理器socket的内存通道数.
-r
r指定内存ranks数.
-m
m指定启动时分配的内存字节数.
--in-memory
in-memory指定不要创建任何共享数据结构, 完全运行在内存中. 等效于 --no-shconf
和 --huge-unlink
.
--iova-mode
iova-mode指定IOVA模式, 参数为pa, va.
debug参数
--no-shconf
不创建共享文件, 暗指不支持多进程.
--no-huge
使用匿名存储而不是大页, 暗指不支持多进程.
--log-level
指定特定组件的日志级别, 参数为组件加日志级别.
./helloworld --log-level eal:8
其他参数
-h(--help)
显示帮助信息.
-v
显示版本.
--mbuf-pool-ops-name
mbuf的内存池名字.
helloworld分析
static int
lcore_hello(__attribute__((unused)) void *arg)
{
unsigned lcore_id;
lcore_id = rte_lcore_id(); // 获取当前线程核ID
printf("hello from core %u\n", lcore_id);
return 0;
}
int
main(int argc, char **argv)
{
int ret;
unsigned lcore_id;
// eal初始化
ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_panic("Cannot init EAL\n");
// 遍历服务线程核打印hello world
// 相当于rte_eal_mp_remote_launch(lcore_hello, NULL, SKIP_MASTER);
RTE_LCORE_FOREACH_SLAVE(lcore_id) {
rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
}
// 在主线程上打印hello world
lcore_hello(NULL);
// 遍历等待所有服务线程结束
rte_eal_mp_wait_lcore();
// 清除EAL环境中的资源
rte_eal_cleanup();
return 0;
}
Comments | NOTHING