不同类型的dpdk进程对大页内存的使用具有不同的权限,目前两种类型的进程:
primary process,这些内存可以初始化并对共享内存拥有完全权限。
secondary process,不能初始化共享内存,但可以attach到预初始化的共享内存并在其中创建对象。
独立的DPDK进程是primary进程,而secondary进程只能与primary进程一起运行,或者在主进程已经为他们配置了hugepage共享内存之后运行。
为了支持这两种类型的进程,eal增加了两个附加命令行选项:
–proc-type:指定该进程实例是Primary进程还是secondary进程
–file-prefix:允许不想合作的进程拥有不同的内存区域
内存共享
使用DPDK使多进程应用程序工作的关键因素是确保组成多进程应用程序的进程之间正确共享内存资源。一旦有可供多个进程使用的共享内存块,那么诸如进程间通信(IPC)之类的问题就变得简单多了。
以primary或者standalone参数启动应用程序时,DPDK会将它正在使用的内存配置的详细信息记录到内存映射文件中 - 正在使用的hugepages,它们映射到的虚拟地址、存在的内存通道数等。当secondary进程启动时,这些内存映射文件被读取,并且EAL在secondary进程中重新创建相同的内存配置,以便进程之间共享所有内存区域,并且指向该内存的所有指针都有效,并指向两个进程中相同的对象。
部署模型
Symmetric/Peer Processes
DPDK多进程支持可用于创建一组对等进程,其中每个进程执行相同的工作负载。这个模型相当于让多个线程每个线程运行同一个主循环函数,就像在提供的大多数DPDK示例应用程序中所做的那样。在这个模型中,生成的第一个进程应使用–proc-type=primary EAL标志,而所有后续进程都使用–proc-type=secondary标志生成。
Asymmetric/Non-Peer Processs
该部署模型是使用单个primary进程作为load-balancer或者server,在工作线程或客户端线程之间分发接收到的数据包,这些线程作为secondary进程运行,在这种情况下,大量使用了位于共享hugepage内存中的rte_ring对象。
Running Multiple Independent DPDK Applications
除了上述涉及多个DPDK进程协同工作的场景外,还可以并行运行多个DPDK进程,其中这些进程都是独立工作的。对这种使用场景的支持是通过对EAL使用–file prefix参数提供的。
默认情况下,EAL使用rtemap_X文件名在每个hugetblfs文件系统上创建Hugepage文件,其中X在0到最大hugepages - 1之间。类似地,当以root身份运行时,它使用/var/run/.rte_config文件创建共享配置文件来在每个进程中映射内存。可以使用–file-prefix参数上述每个文件名的rte部分。
Running Multiple Independent DPDK Applications
与在单个系统上并行运行独立的DPDK应用程序的方式相同,这可以简单地扩展到并行运行的DPDK应用程序的多进程组。在这种情况下,secondary进程必须使用与它们所连接的共享内存的primary进程相同的–file-prefix参数。