• DPDK线程启动方式


    dpdk线程

    rte_eal_init执行时会通过pthread_create创建一个worker线程(eal_thread_loop),并绑定到配置的lcore上,
    可通过参数-c/-l/--lcores指定在那些核心创建worker线程。
    每个worker线程拥有一对管道fd用于与master线程通信。
    worker线程内部时一个while超循环结构,在循环开始处通过read管道阻塞线程。
    master线程调用rte_eal_remote_launch或rte_eal_mp_remote_launch创建用户线程时,
    实现上是通过write对应core的管道唤醒worker线程,再执行rte_eal_remote_launch传入的函数。

    几种用户线程初始化方式

    在每个slave核上创建线程

    RTE_LCORE_FOREACH_SLAVE(lcore_id) {
    	rte_eal_remote_launch(user_loop, param, lcore_id);
    }
    

    在除了master核的其他核上创建线程

    rte_eal_mp_remote_launch(user_loop, param, SKIP_MASTER);
    

    dpdk线程的思考

    前文提到rte_eal_remote_launch创建线程实际时唤醒对应lcore的worker线程
    通过cpu_layout.py可以查看当前cpu的核心分布,例如:

    ======================================================================
    Core and Socket Information (as reported by '/sys/devices/system/cpu')
    ======================================================================
    
    cores =  [0, 1]
    sockets =  [0]
    
           Socket 0     
           --------     
    Core 0 [0, 1]       
    Core 1 [2, 3]  
    

    上面两种dpdk线程初始化方式都会跳过core 0 的0核(默认的master核心)
    那么问题来了
    对于启用了超线程的cpu,一个物理核上会存在两个两个逻辑核(lcore)
    那么data path的任务是否适合放在上面这个cpu的core0-1上呢?
    拍脑袋想也应该时不合适的吧?
    那么在线程初始化的适合,是否应该根据cpu分布,

    1. 避免在master物理核心的两个lcore上跑data path任务
    2. 在每个物理核上仅选择一个lcore创建任务

    理由是,超线程的两个逻辑核心是共享流水线和L1/L2 Cache的,超线程是否适合dpdk?

    不知道为啥,在大部分代码里看到的是上面这两种任务初始化,而不是根据物理核心初始化

  • 相关阅读:
    g++
    Adapter
    使用 JDBC 连接MySQL 、SQL Server数据库
    Chrom Firefox 非安全端口访问
    Cent OS & Windows 双系统自定义引导菜单
    Cent OS 7 安装海峰、极点五笔输入法
    数据结构:单链表
    切记要初始化指针
    Java 连接 MySQL 数据库
    C语言 Struct 结构体在 Java 中的体现
  • 原文地址:https://www.cnblogs.com/zl-yang/p/11023893.html
Copyright © 2020-2023  润新知