DPDK多线程
DPDK线程其实就是普通的pthread,属于抢占式线程模型,受内核调度支配,DPDK通过在多核设备上创建多个线程,每个线程绑定到单独的核上,减少线程调度的开销。
DPDK中的线程一般分为控制线程和调度线程两种,控制线程一般分配在MASTER核上,接收用户配置,并传递配置参数给数据线程等;数据线程则分布在不同的SLAVE核上处理数据包。
线程的亲和性
多核体系的CPU。物理核上的线程来回切换就会导致L1/L2 cache命中率下降,如果线程和core绑定的话,线程就会在指定的core上跑,不会被操作系统调度到别的核上,线程之间也互不干扰地完成工作,节省了操作系统来回调度的时间。因此将线程和core绑定可以提高CPU cache的命中率,从而减少内存访问消耗。
rte_eal_remote_launch(lcore_function_t *f, void * arg, unsigned slave_id)
启动另一个逻辑核上的函数。这个函数只会在MASTER逻辑核上执行。
向处于WAIT状态(第一次调用rte_eal_init()之后就会处于这个状态)的slave逻辑核上发送消息。WAIT状态可以通过首次调用rte_eal_wait_lcore(slave_id)来检查。
当远程的lcore接收到消息,它会切换至RUNNING状态,然后用参数arg调用函数f。一旦执行完成,远程的lcore就会切换至FINISHED状态,并且f的返回值被存储在要使用rte_eal_wait_lcore()读取的本地变量中。
一旦消息被发送,MASTER lcore就返回,并且对function的完成一无所知。
参数
f: 将被调用的函数。
arg: 函数的参数。
slave_id: 要在其上执行函数的lcore的slave_lcore的id.
RTE_PER_LCORE(name)
读或写每个逻辑核的变量值。在每个内存区域设置lcore ID。这是一个线程变量。
几个lcore对同一个内存区域进行的读写访问操作可能会产生大量数据告诉缓冲未命中,这代价非常昂贵,因此使用了RTE_PER_LCORE变量,处于lcore x上的数据在lcore y上的数据是无效的。