现象

多进程场景下,进程有两种角色Primary或者Secondary,正如其名字,Primary进程可以create 资源,而Secondary进程只能 attach已存在的资源。一山不容二虎,一个多进程的应用,有且只有一个Primary进程,其余都是Secondary进程。应用可以通过命令行参数 –proc-type 来指定应用类型。

本人的业务不需要共享任何资源,出现下面的异常,日志如下:

Starting SPDK v20.04 git sha1 569b301 / DPDK 19.11.0 initialization...
[ DPDK EAL parameters: block_system_tool -l 29,30,31 -m 1024 --log-level=lib.eal:6 --log-level=lib.cryptodev:5 --log-level=user1:6 --iova-mode=pa --base-virtaddr=0x200000000000 --match-allocations --file-prefix=spdk0 --proc-type=auto ]
EAL: Fail to recv reply for request /var/run/dpdk/spdk0/mp_socket:eal_vfio_mp_sync
EAL:   cannot request default container fd
EAL: VFIO support could not be initialized
app.c: 646:spdk_app_start: *NOTICE*: Total cores available: 3

分析

一台机器上启动多个dpdk进程,默认应该是只有一个主进程,其他的都会与第一个主进程关联,如果第一个主进程挂掉了,会对其他进程产生影响,除非进程间无关联,这个就是通过-i控制。表示资源(内存,设备)都是共享的。

加了 -i 那就是 主副进程 的关系,表示资源(内存,设备)都是共享的。
一台机器上不需要主副关系,那就不需要加-i参数,每个进程只attach自己的设备。

-i 没用默认值,没用主从关系的不用-i 就可以。

解决方法

去掉spdk 函数中多的-i 参数

相关参数

–proc-type:指定一个dpdk进程是主进程还是副进程(参数值就用上面的primary或是secondary,或者是auto

参考链接

https://blog.csdn.net/mrwangwang/article/details/95218575