在上次使用ovs+dpdk创建vhostuser端口与qemu虚拟机链接成功后,虚拟机无法ping通主机侧ovs网桥br0端口的问题被遗留下来,经过一段时间的摸索总算成功解决该问题。
在起虚拟机后一段时间,观察到ovs日志存在一些报错如下:
由此可知创建mempool失败,大概率是我这年迈的主机内存不足,分配的大页内存数量不够,于是将大页内存预留4G给ovs并设置ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=4096,然并卵。
于是开始阅读代码,错误出现在rte_pktmbuf_pool_create_by_ops函数内
此处操作为根据名字寻早合适的ops方法,代码如下
最终是因为找不到ops所以返回失败。那么问题来了,为什么找不到方法,是名字异常?还是没有注册成功。通过调试,发现ops名字是默认使用的ring_mp_mc,并且发现该ops在运行时会提前注册,并不需要人为调用注册。是不是没有使用librte_mempool_ring.so?于是找到加载so的初始化代码如下:
怀疑此路径是否正确,于是打印该路径后发现该路径确实存在问题
/root/rpmbuild/BUILDROOT/dpdk-22.11-3.el7.x86_64/lib64/dpdk/pmds-23.0
由于我编译时基于rpm编译,该路径变量是基于编译时配置的prefix路径,因此在安装dpdk后并不存在该路径。于是修改该路径默认值为实际so的安装路径/lib64/dpdk/pmds-23.0,编译dpdk重新安装,并重启ovs,接下来就是见证奇迹的时刻:
完美收官!接下来还有两个第一阶段学习遇到的问题需要解决,一个是ovs-dpctl show异常日志,另外一个就是使用rpm包安装debuginfo后仍然gdb没有堆栈的问题。