本文以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_19.08的代码截图
问题都是一样的,双开时相当于两次fcntl操作了同一个文件(mem_cfg_fd),查看errno发现也是这样的retval的返回值是 11 即 EAGAIN /* Try again */