DPDK-22.11.2 [五] 多进程

发布时间 2023-10-13 15:18:30作者: 秋来叶黄

dpdk支持多进程运行,不过要指定参数打开,如果没有设定,但开启第二个dpdk程序是会报错,告诉你相关系统资源被占用。

EAL: Cannot create lock on '/var/run/dpdk/rte/config'. Is another primary process running?
EAL: FATAL: Cannot init config
EAL: Cannot init config

dpdk有两种进程类型

  • primary processes 主进程 初始化,对共享内存有所有权限
  • secondary processes 子进程 不能初始化共享内存,可以附加到一个已经初始化的共享内存

多进程需要的参数

  • --proc-type 指定是主进程还是子进程,参数可选是primary/secondary/auto。auto表示,如果已经有主进程开启,那么就会把新的进程当作子进程
  • --file-prefix 指定进程使用不同的内存

使用dpdk多进程,必须是同一dpdk版本编译的程序。

内存共享

当开启多进程后,就多了一些IPC进程间通信的问题需要注意。

如果主进程使用了--legacy-mem或者--single-file-segments参数,那么子进程也必须使用相同的参数。

部署方式

对等模式

这个就相当于把原来dpdk多个线程的模式,改成了多个进程,启动主进程,初始化好数据,然后开启多个子进程,分别接收对应端口的数据。并且主进程与子进程是对等的。

不对等模式

一个主进程,用来做负载均衡,把数据发送到其他线程或者子进程。这个会大量用到rte_ring,ret_ring存在于共享大页内存上。

多个独立的dpdk程序

指定--file-prefix,可以让dpdk运行在相互独立的模式。在相互独立模式下,每个网口都是独立隔离的,不同dpdk之间不可以相互使用,一个网口被一个dpdk程序使用后,就无法被其他dpdk程序使用。

dpdk运行的一些配置信息保存在一个目录中,如果设定了\(RUNTIME_DIRECTORY,那么就保存在\)RUNTIME_DIRECTORY/dpdk目录中。如果没有设定,如果dpdk是root用户运行的,那么就存在/var/run/dpdk中,不然就存在/tmp/dpdk或者$XDG_RUNTIME_DIRECTORY/dpdk中。

ls /var/run/dpdk/rte 
config  dpdk_telemetry.v2  fbarray_memseg-1048576k-0-0  fbarray_memseg-1048576k-0-1  fbarray_memseg-1048576k-1-0  fbarray_memseg-1048576k-1-1  fbarray_memzone  hugepage_info  mp_socket

大页内存文件保存在系统的hugetlbfs中,名字是rtemap_X,X范围是0到大页内存最大数量减一。

ls /dev/hugepages/
libvirt  rtemap_16384

正常情况,会为每个进程创建共享配置文件和内存映射文件,文件名是.rte_config。

上面提到的rte相关的文件名都由file-prefix参数指定。

这种模式下,每个dpdk进程都必须限制对大页内存的使用数量,只能分配自己需要的大小。如果使用--legacy-mem参数,dpdk就会分配所有的大页内存。可以使用-m每个进程使用设定多少MB的大页内存,也可以使用--socket-mem设定每个进程每个socket可以使用多少大页内存。

运行多组相互独立的dpdk

这个的意思就是有多个dpdk程序,但是有一些是同一组,另一些是单独的一组。这样的话需要子进程使用指定--file-prefix同一组dpdk创建的共享内存。

多进程dpdk的注意事项

  • dpdk多进程需要共享大页内存完全匹配,这样对子进程启动有着不可控的风险。
  • 所有的dpdk进程都要运行在不同的cpu core上。如果两个示例运行在同一个逻辑core上,会导致内存池缓冲区损坏等问题。
  • 所有的中断,比如网卡设备链接状态,在子进程都不起作用。需要自己维护传递相关信息。
  • 不同编译二进制的函数指针,在不同的进程间是无法使用的。a second. This prevents the librte_hash library from behaving properly as in a multi-process instance, since it uses a pointer to the hash function internally.

多进程间通信

dpdk提供了用于进程间通信的api

https://doc.dpdk.org/guides-22.11/prog_guide/multi_proc_support.html
http://doc.dpdk.org/guides-22.11/sample_app_ug/multi_process.html