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