DPDK 多进程

本文详细介绍了DPDK库中支持的多进程操作,重点讲解了关键启动参数如--proc-type、--file-prefix和--socket-mem的用法,并列举了四种多进程应用场景:基本多进程、对称多进程、客户端-服务器多进程和主从多进程。通过实例展示了进程间如何通过ring、内存池等进行信息交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DPDK库里是支持多进程和多线程,本文主要总结多进程的相关的操作。

DPDK多进程使用的关键启动参数:

  • --proc-type:指定一个dpdk进程是主进程还是副进程(参数值就用上面的primary或是secondary,或者是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只会使用这个参数对应的网卡,不会初始化其他的。

在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/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

    1. [root@localhost lib]# ps -elf | grep simple_mp
      0 S root       8457 124128 13  80   0 - 8389378 wait_w 03:24 pts/1  00:00:16 ./build/simple_mp -l 0-1 --proc-type=primary
      0 S root       8471   7504  6  80   0 - 8389498 wait_w 03:24 pts/2  00:00:06 ./build/simple_mp -l 0-1 --proc-type=secondary
      0 S root       8564  57486  0  80   0 -  1729 pipe_w 03:26 pts/0    00:00:00 grep --color=auto simple_mp
      [root@localhost lib]# ps -mo pid,tid,%cpu,psr -p 8471
         PID    TID %CPU PSR
        8471      -  6.0   -
           -   8471  0.0   0
           -   8472  0.0  33
           -   8473  0.0  10
           -   8474  6.0   1
      [root@localhost lib]# ps -T  -p 8471
         PID   SPID TTY         
### DPDK多进程源码分析 DPDK(Data Plane Development Kit)是一个高性能的数据平面开发工具包,主要用于加速网络应用中的数据包处理。其多进程支持允许多个独立的DPDK进程协同工作以完成特定的任务[^2]。 #### EAL初始化过程 在DPDK中,多进程的支持主要依赖于EAL(Environment Abstraction Layer)。当启动一个多进程程序时,EAL会负责初始化共享内存区域以及同步机制。这些资源对于不同进程之间的通信至关重要。具体来说,在`rte_eal_init()`函数内部实现了对共享内存段的创建和映射操作。 ```c int rte_eal_init(int argc, char **argv); ``` 该函数不仅解析命令行参数还完成了如下几项重要任务: - 设置全局变量`internal_config->process_type`表示当前运行的是主进程还是次级进程。 - 如果检测到已有其他实例存在,则尝试连接已有的共享内存池;否则新建一个新池子供后续加入者使用。 #### 进程间同步与资源共享 为了实现高效而安全的跨进程访问控制,DPDK引入了几种不同的锁原语用于保护临界区代码片段免受竞争条件影响: 1. 自旋锁(`rte_spinlock_t`):适用于短时间锁定场景下减少上下文切换开销; 2. 互斥量(`pthread_mutex_t`)封装版本——即所谓的公平性更好的读写锁方案之一; 3. 原子计数器类APIs如`rte_atomic*_*()`系列宏定义提供了细粒度级别的并发管理能力[^3]。 以下是关于如何利用上述提到的技术构建实际应用程序的一个简单例子展示: ```c #include <rte_common.h> #include <rte_lcore.h> #include <rte_ring.h> struct my_shared_data { struct rte_ring *ring; }; /* Assume this function is called by secondary process */ void init_secondary(struct my_shared_data *data){ data->ring = rte_ring_lookup("my_rings"); } // Primary Process Code Snippet... if (rte_eal_process_type() == RTE_PROC_PRIMARY) { struct my_shared_data pdata; pdata.ring = rte_ring_create("my_rings", 1024, SOCKET_ID_ANY,RING_F_SP_ENQ|RING_F_SC_DEQ); } ``` 通过以上示范可以看出,无论是初级还是辅助角色都能轻松获取预先分配好的环形缓冲队列对象来进行消息传递等活动。 #### 总结 综上所述,DPDK多进程特性极大地增强了系统的灵活性和可扩展性。通过对底层基础设施的有效管理和合理设计接口协议,使得开发者可以更加专注于业务逻辑本身而不必担心复杂的线程调度或者分布式计算带来的额外负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值