DPDK多进程间通信机制

DPDK将进程分为两种 : primary process 和secondary process。由primary process对系统的资源(如内存,vfio container等)进行初始化,而secondary process通过共享内存访问即可。

进程间通信(Inter-Process Communication, 缩写为IPC)主要采用两种方式:
1、共享内存通信(memory share)
2、Socket

共享内存:

结合rte_ring队列以及大页共享内存来实现多进程间得交互。

socket:

此方式是dpdk基于AF_UNIX/SOCK_DGRAM封装得一套进程间通信API,
DPDK每个进程在eal初始化时创建一个控制线程用来监听来自其他进程的消息,接收到消息后,会根据消息的类型(同步或者异步)进行不同的处理,代码见rte_mp_channel_init(), process_msg()(位于文件lib/librte_eal/common/eal_common_proc.c)。
此通信方式性能并不是最优方式,只是DPDK实现得一套较为通用的通信接口,方便使用。如对性能要求较高,视情况决定是否合适。

实现:

1、内存同步使用了socket

从进程发起内存申请过程

DPDK多进程间通信机制_第1张图片

从进程释放过程:

DPDK多进程间通信机制_第2张图片

常见问题点:

Q1、多进程时申请内存效率是否会受影响?
A1、legacy模式下不需要同步,不受影响; 非legacy时,只有try_expand_heap时才需要进程间同步,所以是否影响取决与heap是否会频繁变化,如果运行时频繁使用rte_malloc申请释放内存,可能会导致heap收缩、扩展频繁,此时还是会影响性能的,因为同步时需要经过多次unix socket通信。特别是从进程还是阻塞式的等待同步结果。(主进程是异步方式)

未解决疑惑:

1、loclal_memsegs变量是做什么用的?主从进程的内存同步是为了解决什么问题?(memseg_list本来就是共享内存,主进程更新完,从进程直接就可以使用,不需要同步?)

你可能感兴趣的:(DPDK,linux,系统,linux)