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分布,
- 避免在master物理核心的两个lcore上跑data path任务
- 在每个物理核上仅选择一个lcore创建任务
理由是,超线程的两个逻辑核心是共享流水线和L1/L2 Cache的,超线程是否适合dpdk?
不知道为啥,在大部分代码里看到的是上面这两种任务初始化,而不是根据物理核心初始化