Dpdk distrabutor
1.创建分流器distrabutor
首先要检测系统的核数,核数至少需要2个才可以运行,建议核数大于等于3个,可以在分配worker时达到较好的效果。
接下来就创建分流器了
static struct rte_distributor *d;
d =rte_distributor_create("Test_distributor", rte_socket_id(),
rte_lcore_count()- 1);
如果d返回null,创建失败,记得要删除分流器哦。
rte_distributor_flush(d);
rte_distributor_clear_returns(d);
2.分配内存池
static struct rte_mempool *p;
p =rte_mempool_create("DT_MBUF_POOL", nb_bufs,
MBUF_SIZE,BURST,
sizeof(structrte_pktmbuf_pool_private),
rte_pktmbuf_pool_init,NULL,
rte_pktmbuf_init,NULL,
rte_socket_id(),0);
为分流器分配内存池,内存池的大小固定。大小为MBUF_SIZE*nb_bufs
3.为worker指定工作函数
rte_eal_mp_remote_launch(handle_work,d, SKIP_MASTER);
其中handle_work为worker的工作函数
使用rte_distributor_get_pkt从内存池中获取包,此时可以根据包的app_id在handle_work中调用对应的函数来处理不同app_id的包
4.处理在mempool中的包
struct rte_mbuf *bufs[BURST];
首先使用rte_mempool_get_bulk函数从mempool中获取包的句柄。
接下来修改包的hash值,方便分流器将hash值相同的包送到同一个worker去处理。
同时判断包的app类型,给packet打上mark,方便后续处理。
标记包的hash值后,使用
rte_distributor_process(d, bufs, BURST);
rte_distributor_flush(d);
这两个函数将包分配到指定的worker去处理。
预想中的大致流程图如下:
每个worker取包后,根据包的app_id,调用对应的函数处理 。