DPDK Graph 框架节点间传递报文方式
DPDK Graph 框架在 node 间传递 object 对象的方式主要有两种:Normal Enqueue 和 Home Run
其中,Normal Enqueue 又可以细分为使用 rte_node_next_stream_get 、rte_node_next_stream_put 的手动复制流程和使用 rte_node_enqueue* 系列函数的简单流程
Normal Enqueue 流程
手动复制流程
- 使用
rte_node_next_stream_get()获取目标节点的 objs 对象数组,如果目标数组不够大,会动态扩展数组 - 将需要传递的 object 对象手动通过
rte_memcpy()等函数复制到目标数组 - 使用
rte_node_next_stream_put()将目标节点置于 pending state
简单流程
使用 rte_node_enqueue_x1() 、rte_node_enqueue_x2() 、rte_node_enqueue() 、rte_node_enqueue_next() 等函数将 object 对象传递到目标数组。
使用 rte_node_enqueue* 系列函数时,会自动处理动态扩展数组、复制对象、将节点置于 pending state 等操作。使用简单、方便,但是每次调用都会处理一遍上述流程,所以性能最差。
Home Run 流程
性能最好,限制也最严格的流程。只有当当前节点中的所有 object 对象都将传递到同一个目标节点时,才能使用。
调用 rte_node_next_stream_move() 函数,首先检测目标节点的 objs 对象数组是否为空。
不为空时调用 rte_node_enqueue() 将所有本节点的 object 对象添加到目标节点;
为空时,则直接将本节点的 objs 对象数组和目标节点的 objs 对象数组的指针交换,只交换一次指针,性能最好。