DPDK基础篇-1

发布于 2022-08-02  14 次阅读


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;
}


人生如逆旅,我亦是行人。