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?

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

原文地址:https://www.cnblogs.com/zl-yang/p/11023893.html