DPDK支持多线程以提高报文处理性能,充分利用多核特性。
DPDK 用于创建多线程的接口为 rte_eal_mp_remote_launch,由rte_eal库提供。
此函数将使用全部可能的核心以创建线程。如下所示,该函数含有三个参数,第一个参数是线程处理函数指针,第二个参数是处理函数的入参,第三个参数用于甄别是否使用主核心创建线程,有效值为SKIP_MASTER 及 CALL_MASTER,前者表示使用除了主核心以外的全部核心创建线程,后者表示使用全部核心创建线程,以四核系统为例,前者创建3个线程,后者创建4线程。
int rte_eal_mp_remote_launch(int (*f)(void *),
void *arg, enum rte_rmt_call_master_t call_master);
主核心并不确定,它取决于 DPDK 程序本身是否绑定了核心,在没有绑定的情况下,DPDK程序的运行核心取决于操作系统核心调度策略以及核心使用情况,因此主核心不确定。一般核心均空闲的情况,默认使用核心0运行。
线程一旦建立,将绑定在特定的核心当中,因此也就完成了核心的绑定。
下面给出一个示例函数,它在四核系统中通过 rte_eal_mp_remote_launch 创建了线程,因为第三个参数置为 SKIP_MASTER,因此总共创建了三个线程,绑定在除主核心之外的其他核心上。此外,它只希望使用核心1运行,因此,其他没有绑定核心1的线程将被结束。因此,最终的结果是,此函数会在核心1上运行,并且每间隔1