0%

DPDK Graph 框架节点间传递报文方式

DPDK Graph 框架节点间传递报文方式

DPDK Graph 框架在 node 间传递 object 对象的方式主要有两种:Normal Enqueue 和 Home Run

其中,Normal Enqueue 又可以细分为使用 rte_node_next_stream_getrte_node_next_stream_put 的手动复制流程和使用 rte_node_enqueue* 系列函数的简单流程

Normal Enqueue 流程

手动复制流程

  1. 使用 rte_node_next_stream_get() 获取目标节点的 objs 对象数组,如果目标数组不够大,会动态扩展数组
  2. 将需要传递的 object 对象手动通过 rte_memcpy() 等函数复制到目标数组
  3. 使用 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 对象数组的指针交换,只交换一次指针,性能最好。