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有两种进程类型
多进程需要的参数
PS:使用dpdk多进程,必须是同一dpdk版本编译的程序。
当开启多进程后,就多了一些IPC进程间通信的问题需要注意。
如果主进程使用了--legacy-mem或者--single-file-segments参数,那么子进程也必须使用相同的参数。
这个就相当于把原来dpdk多个线程的模式,改成了多个进程,启动主进程,初始化好数据,然后开启多个子进程,分别接收对应端口的数据。并且主进程与子进程是对等的。
一个主进程,用来做负载均衡,把数据发送到其他线程或者子进程。这个会大量用到rte_ring,ret_ring存在于共享大页内存上。
指定--file-prefix,可以让dpdk运行在相互独立的模式。在相互独立模式下,每个网口都是独立隔离的,不同dpdk之间不可以相互使用,一个网口被一个dpdk程序使用后,就无法被其他dpdk程序使用。
dpdk运行的一些配置信息保存在一个目录中,如果设定了,那么就保存在,那么就保存在����������������,那么就保存在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程序,但是有一些是同一组,另一些是单独的一组。这样的话需要子进程使用指定--file-prefix同一组dpdk创建的共享内存。
在Multi-process Sample Application中介绍了4种使用场景:
[root@localhost simple_mp]# ./build/simple_mp -l 0-1 --proc-type=primary
EAL: Detected 128 lcore(s)
EAL: Detected 4 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:05:00.0 on NUMA socket 0
EAL: probe driver: 19e5:200 net_hinic
net_hinic: Initializing pf hinic-0000:05:00.0 in primary process
net_hinic: Device 0000:05:00.0 hwif attribute:
net_hinic: func_idx:0, p2p_idx:0, pciintf_idx:0, vf_in_pf:0, ppf_idx:0, global_vf_id:15, func_type:2
net_hinic: num_aeqs:4, num_ceqs:4, num_irqs:32, dma_attr:2
net_hinic: API CMD poll status timeout
net_hinic: chain type: 0x7
net_hinic: chain hw cpld error: 0x1
net_hinic: chain hw check error: 0x0
net_hinic: chain hw current fsm: 0x0
net_hinic: chain hw current ci: 0x0
net_hinic: Chain hw current pi: 0x1
net_hinic: Send msg to mgmt failed
net_hinic: Failed to get board info, err: -110, status: 0x0, out size: 0x0
net_hinic: Check card workmode failed, dev_name: 0000:05:00.0
net_hinic: Create nic device failed, dev_name: 0000:05:00.0
net_hinic: Initialize 0000:05:00.0 in primary failed
EAL: Requested device 0000:05:00.0 cannot be used
EAL: PCI device 0000:06:00.0 on NUMA socket 0
EAL: probe driver: 19e5:200 net_hinic
EAL: PCI device 0000:7d:00.0 on NUMA socket 0
EAL: probe driver: 19e5:a222 net_hns3
EAL: PCI device 0000:7d:00.1 on NUMA socket 0
EAL: probe driver: 19e5:a221 net_hns3
EAL: PCI device 0000:7d:00.2 on NUMA socket 0
EAL: probe driver: 19e5:a222 net_hns3
EAL: PCI device 0000:7d:00.3 on NUMA socket 0
EAL: probe driver: 19e5:a221 net_hns3
APP: Finished Process Init.
Starting core 1simple_mp > primary send hello1
Command not foundsimple_mp > send hello by primary
Bad argumentssimple_mp >
simple_mp > send hello_by_primarysimple_mp > core 1: Received 'hello_by_sencondary'
simple_mp >
./build/simple_mp -l 0-1 --proc-type=secondary
dpdk提供了用于进程间通信的api
43. Multi-process Support — Data Plane Development Kit 22.11.3 documentation
26. Multi-process Sample Application — Data Plane Development Kit 22.11.3 documentation