参考DPDK Pktgen+Docker搭建VNF环境及验证一文中的部署方法,在实际环境中进行验证;本文记录验证过程中遇到的坑以及解决方法,另外,还验证了另外一种部署方式。
方案一
拓扑图

docker0
开启docker0,并在docker0上启动testpmd,由testpmd创建两个vhost口,命令如下(关于testpmd的参数详情可以参考这里):
docker run -it --privileged --name=dpdk-docker0 -v /mnt/huge:/mnt/huge -v /tmp/virtio/:/tmp/virtio/ dpdk-docker:17.05
testpmd -l 0-1 -n 1 --socket-mem 1024,1024 \
--vdev 'eth_vhost0,iface=/tmp/virtio/sock0' --vdev 'eth_vhost1,iface=/tmp/virtio/sock1' \
--file-prefix=dpdk --no-pci \
-- -i --forward-mode=io --auto-start
docker1
同理,启动docker1和testpmd,命令如下:
docker run -it --privileged --name=dpdk-docker1 -v /mnt/huge:/mnt/huge -v /tmp/virtio/:/tmp/virtio/ dpdk-docker:17.05
testpmd -l 0-1 -n 1 --socket-mem 1024,1024 \
--vdev 'eth_vhost2,iface=/tmp/virtio/sock2' --vdev 'eth_vhost3,iface=/tmp/virtio/sock3' \
--file-prefix=dpdk2 --no-pci \
-- -i --forward-mode=io --auto-start
主机端启动pktgen
pktgen的简单说明在文章开头的参考一文中有提及,这里就不再累述。启动命令如下:
# 以下命令在主机中运行
# DPDK的参数同上,--vdev在这里用来连接到socket文件
# pktgen的参数
# -P 在所有端口启用混杂模式
# -m 定义CPU核到端口的绑定,在这里core5绑定到prot0,core6绑定到port1
pktgen -l 2-6 -n 3 --socket-mem 1024,1024 --vdev='virtio_user0,path=/tmp/virtio/sock0' --vdev='virtio_user1,path=/tmp/virtio/sock1' \
--vdev='virtio_user2,path=/tmp/virtio/sock2' --vdev='virtio_user3,path=/tmp/virtio/sock3' --no-pci -- -P -m "3.0,4.1,5.2,6.3"
在pktgen中发包:
# 在pktgen中设置速率为10%,更具体的速率设置可以通过tx_cycles设置
# 端口0共发送50个包,端口1发送100个,端口2发送150个,端口3发送200个
Pktgen:/>set all rate 10
Pktgen:/>set 0 count 50
Pktgen:/>set 1 count 100
Pktgen:/>set 2 count 150
Pktgen:/>set 3 count 200
Pktgen:/>str
验证结果如下:
host端:
0<—–>1 口对发,2<—–>3口对发

docker0端:

docker1端:

在方案一的验证过程中遇到的坑和解决方案如下:
- 在docker中启动testpmd时提示:docker container error while loading shared libraries: libnuma.so.1
解决方法:docker运行时指定–privileged选项; 在Dockerfile中执行apt-get install numactl; - host端启动pktgen时端口无法up,需要添加在启动pktgen软件时指定–no-pci选项。
方案二
方案一种是在docker中创建vhost口,在host端使用virtio口,这种使用方式并不常见;更多的使用方法是在host上启动vhost后端驱动,在docker中启动virtio驱动。
下面就按照这种思路再验证一次。
拓扑图

主机端
创建两个虚拟口eth_vhost0, eth_vhost1, 并分别绑定3核和4核,两个口互相对发
pktgen -l 2-6 -n 3 --socket-mem 1024,1024 --vdev='eth_vhost0,iface=/tmp/virtio/sock0' --vdev='eth_vhost1,iface=/tmp/virtio/sock1' --no-pci -- -P -m "3.0,4.1"
docker
需要注意这里和方案一中有如下区别:启动testpmd时不能打开-a选项自动转发,否则无法和host端的vhost口协商成功,具体参数可参考命令实现。
具体命令如下:
docker run -it --privileged --name=dpdk-docker0 -v /mnt/huge:/mnt/huge -v /tmp/virtio/:/tmp/virtio/ dpdk-docker:17.05
testpmd -l 0-1 -n 1 --socket-mem 1024,1024 --vdev 'virtio_user0,path=/tmp/virtio/sock0' --vdev 'virtio_user1,path=/tmp/virtio/sock1' --file-prefix=dpdk --no-pci -- -i --txqflags=0xf00 --disable-hw-vlan
后面用和方案一相同的验证方式即可。
来源:CSDN
作者:心似白云
链接:https://blog.csdn.net/me_blue/article/details/78530317