DPDK: 多进程

背景

        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:允许非合作的进程拥有不同的内存区域。主副进程默认文件路径/var/run/.rte_config,同一个处理组的主副进程使用相同的参数,如果想运行多个主进程,这个参数就必须指定!
  • --socket-mem:设置从hugepages分配多大的存储空间。默认会用掉所有的hugepages,所以建议指定这个参数,不管是单cpu还是在NUMA中。
    eg:单socket,--socket-mem=512;在numa中,--socket-mem=512,512;多个socket间用‘,’号隔开;
  • -w : 后面跟网卡的PCI号,指定使用网卡。设置了这参数,DPDK只会使用这个参数对应的网卡,不会初始化其他的。
     

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

内存共享

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

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

部署方式

对等模式

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

不对等模式

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

多个独立的dpdk程序

        指定--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

        这个的意思就是有多个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.

多进程间通信

        在Multi-process Sample Application中介绍了4种使用场景:

  • Basic Multi-process Example,DPDK进程间通过ring,内存池,队列,进行信息交互。
  • Symmetric Multi-process Example,主进程初始化所有资源,副进程直接获取资源进行数据包处理,副进程除了不初始化资源,数据包处理和主进程是一样的。每个进程获取每个端口的一个RX, TX队列。
  • Client-Server Multi-process Example,主进程初始化资源和接收所有收到的数据包并轮询分发给副进程处理。
  • Master-slave Multi-process Example,这个模式主要是介绍各进程之间存在依赖关系,主进程和副进程,副进程和副进程。
     

[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 1

simple_mp > primary send hello1
Command not found

simple_mp > send hello by primary
Bad arguments

simple_mp > 
simple_mp > send hello_by_primary

simple_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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术探索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值