vpp/dpdk多开(以vpp为例同时开启两个vpp程序)

本文以vpp双开为例来介绍下当时定位该问题的一个历程。
vpp版本18.07(其dpdk版本为18.05)

实验发现vpp(或dpdk)较新的版本天然支持多开,例如dpdk的19.08版本就天然支持,这里主要讲解下老版本不能双开(或新版本可以双开)的本质问题。

先来看下双开时报的错:Is another primary process running在这里插入图片描述
找到这里就会发现是在rte_config_init初始化时出现问题了,由此根据rte在初始化流程中所作的处理基本可以猜测到可能是资源相关的地方出问题了(事实上的确是该地方出现问题了)。

其实找到上面的那句log信息位置(dpdk),再往上看就可以看出问题所在了,下面给出相应的截图:dpdk_18.05的代码截图
dpdk_18.05的代码截图
dpdk_19.08的代码截图
dpdk_19.08的代码截图

问题都是一样的,双开时相当于两次fcntl操作了同一个文件(mem_cfg_fd),查看errno发现也是这样的retval的返回值是 11 即 EAGAIN /* Try again */
man fcntl的ERROR
查看fcntl的man手册,man fcntl的ERROR的error码截图

多余的话不用解释,看到这里我想大家至少应该已经明白fcntl接口的错误用法会出现什么问题及报错了。

下面说下为什么18.05版本为什么会直接报错死掉,而19.08版本不出直接死掉。
其实很简单两个版本的log就不一样,一个是ret_exit,一个是RET_LOG,从log的level上就可以知道,18.05版本再出现该错误时要求极为严格,而19.08版本则处理的比较简单甚至直接忽略掉该问题。

下面直接说本质:18.05版本默认开启使用内存共享机制,而19.08版本相反不设置的话默认不适用内存共享机制,所以19.08版本认位该问题严重度较轻。但如果19.08版本在配置也开启内存共享机制的话(或者说在开发时需要使用内存共享机制的话),我想大家还得直面该问题,要不还会出现意想不到的事情。

下面说下如何修改该问题:其实很简单请看下面的截图,该截图来自 http://blog.sina.com.cn/s/blog_90cfda2f0102x58j.html 的blog。
dpdk多开的启动选项
很显然差异在 –file-prefix 选项上,该选项配置的name如果相同的话,就会出现双开的两个vpp(或dpdk)程序,在 fcntl 共享内存将要mmap的文件是同一个文件,上面已经说了不能对同一个文件多次进行fcntl操作,即使可以多次fcntl操作,也会导致两个程序在操作内存地址时发生意想不到的意外,所以18.05版本在这里做了操作失败直接退出的处理。

vpp_18.07双开后,看下fcntl操作的那个文件到底是谁:
在这里插入图片描述
就是这个**.vpp_config** 文件,双开时对代码处理后,两个文件分别是 .vpp1_config.vpp11_config

也可以通过查看程序的fd来验证下。双开两个vpp程序时,gdb可以看到对应这个文件的fd返回值(我这里实验时都是fd=15),一开始还有点怀疑两个程序中的fd相同会不会有问题呀,年纪大了有时候脑子会突然断电,有些知识容易一时糊涂,所以就翻了翻《APUE》查了下文件描述符fd相关的内容,直接说结论-----(每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件可以被不同的进程打开也可以在同一个进程中被多次打开。系统为每一个进程维护了一个文件描述符表,该表的值都是从0开始的,所以在不同的进程中你会看到相同的文件描述符,这种情况下相同文件描述符有可能指向同一个文件,也有可能指向不同的文件。),所以说虽然都是fd=15但没有毛关系。

ps -aux | grep vpp 查到连个vpp的pid,通过pid来看下这俩文件:
在这里插入图片描述
在这里插入图片描述
看看是吧,虽然fd都=15,但两文件不是同一个。

下面说下如何修改代码可以保证同时多开vpp
主要在于配置问题,保证连两个vpp的地址空间相互独立。例如以下位置
在这里插入图片描述
在这里插入图片描述
类似于这些资源相关的地方建议都确保 互相不影响。

举个例子代码中这些地方都需要修改一下
在这里插入图片描述
/src/plugins/dpdk/device/init.c — dpdk_config()
在这里插入图片描述
/src/svm/svm.c – svm_map_region()

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置FD.io VPPDPDK,您可以按照以下步骤进行操作: 1. 安装DPDK:首先,确保您的系统符合DPDK的要求,并按照DPDK官方文档中的说明进行安装。您可以从DPDK官方网站上下载DPDK的源代码,并按照提供的说明进行编译和安装。 2. 配置DPDK环境变量:设置DPDK环境变量,包括`RTE_SDK`和`RTE_TARGET`。`RTE_SDK`指向DPDK源代码目录的路径,`RTE_TARGET`指定您要构建的目标平台。例如,在bash shell中,您可以使用以下命令设置环境变量: ``` export RTE_SDK=/path/to/dpdk export RTE_TARGET=<target> ``` 3. 配置VPP:安装FD.io VPP启动VPP进程。您可以从FD.io VPP官方网站上获取安装说明,并根据指南进行安装。在启动VPP之前,确保您已正确配置了DPDK。 4. 配置VPPDPDK集成:编辑VPP的运行时配置文件,通常是位于`/etc/vpp/startup.conf`。将DPDK驱动程序VPP绑定,指定所需的物理接口和CPU核心。 例如,要将DPDK绑定到VPP并配置两个物理接口(例如eth0和eth1),可以在配置文件中添加以下内容: ``` dpdk { dev <DPDK_DEVICE_NAME> { num-rx-queues <NUM_RX_QUEUES> num-tx-queues <NUM_TX_QUEUES> socket-mem <SOCKET_MEM> } } interface <INTERFACE_NAME> { dpdk <DPDK_DEVICE_NAME> } ``` 在上述配置中,您需要将`<DPDK_DEVICE_NAME>`替换为DPDK设备名称(例如`0000:00:00.0`),`<NUM_RX_QUEUES>`和`<NUM_TX_QUEUES>`分别是接收和发送队列的数量,`<SOCKET_MEM>`是用于DPDK内存的分配。 5. 启动VPP:使用VPP启动命令启动VPP进程,例如: ``` sudo vpp -c /etc/vpp/startup.conf ``` 在启动VPP后,它将根据配置文件中的设置与DPDK集成。 请注意,这只是简单的配置示例,您可能需要根据您的特定需求进行更详细的配置。您可以参考FD.io VPPDPDK的官方文档以获取更多详细信息和配置选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值