基于KVM的网络虚拟化和虚拟机热迁移
作者:王金元
学号:121260910054
日期:2022.01.08
1. 任务介绍
在本任务中,我们需要完成以下要求:
1.基于QEMU/KVM创建一个使用virtio-net
的虚拟机:
- 虚拟机安装CentOS操作系统;
- 虚拟机可以通过
virtio-net
设备访问外部网络;
2.高性能的虚拟网络是云计算核心之一:
- 基于DPDK和OVS,部署
vhost-user
方案; - 评测
vhost-user
方案和virtio-net
方案;
3.向高性能+多功能的方向优化:
- 配置
vhost-user
和QEMU启动参数,研究网络设备的多队列特性; - 在
vhost-user
的基础上进行虚拟机热迁移;
本实验的计算资源为:
计算平台:
OS
: macOS Catalina 10.15.7Memory
: 32GBProcessor
: Intel Core i9-9880H @ 2.3GHz * 16Platform
: VMware Fusion Pro 11.5.0
虚拟机环境:
OS
: Ubuntu 20.04LTSMemory
: 16GBDisk Capacity
: 110GBProcessor
: Intel Core i9-9880H @ 2.3GHz * 8
本实验的工作目录是: cc/lab1/
2. 配置环境
2.0 安装依赖
2.1 安装qemu
- 检查kvm
- 安装qemu
2.2. 安装CentOS
- 创建虚拟磁盘
- 创建虚拟机
qemu-setup-vm.sh

- 启动虚拟机,我们把虚拟机的22端口映射到
localhost
的10122端口
qemu-launch-vm.sh

-
我们开启了
enable-kvm
来使用kvm
对虚拟机进行加速,在开启该选项前,我们的虚拟机在6核+4GB内存
的配置下依旧很卡顿,且CPU占用率很高 -
开启
kvm
之后,host和VM的资源占用率如下图,虚拟机非常流畅

2.3 SSH连接虚拟机
- 我们通过SSH来连接虚拟机
- 通过
wget
交大主页www.sjtu.edu.cn
来测试网络可用
3. 部署DPDK和OVS
3.1 部署DPDK
- 我们使用厉宇桐同学的脚本
setup-dpdk.sh
- 检查版本
3.2 部署OVS
- 安装
- 启动OpenVSwitch
- 创建OpenVSwitch端口和桥
4. 网络虚拟化方案
4.1 启动虚拟机
4.1.1 基于vhost-user
方案的虚拟机
- 运行脚本
qemu-launch-vhost-user1.sh
4.1.2 基于virtio
方案的虚拟机
- 运行脚本
qemu-lauch-virtio.sh
4.2 iperf3测试
4.2.1 命令
- 在host上,监听
1314
端口,间隔为1
秒
- 在VM上,使用
30
个客户端并行,持续时间为10
秒
4.2.2 结果
vhost
方案
virtio
方案
- 我们发现
vhost
方案的带宽相较于virtio
方案提升了将近13.8%
4.3 ping测试
4.3.1 命令
- 在VM上,发送
10
个包给host IP =192.168.36.193
4.3.2 结果
vhost
方案
virtio
方案
- 整体看起来,网络延迟方面没有什么区别
5. 多队列技术
网卡多队列技术是指将各个队列通过中断绑定到不同的核上,从而解决网络I/O带宽升高时单核CPU的处理瓶颈,提升网络PPS和带宽性能。经过测试,在相同的网络PPS和网络带宽的条件下,与1个队列相比,2个队列最多可提升性能达50%到100%,4个队列的性能提升更大。
- 在host上运行脚本
qemu-launch-multiqueue.sh
,我们将最大queue设为8
- 在VM上查看网卡的信息
- 我们看到最大queue为8,目前是4,我们将其设置为8,然后观察
virtio2-input
和virtio2-output
的个数
- 我们观察到
virtio2-input
和virtio2-output
的个数也都为8
6. 虚拟机热迁移
热迁移,又叫动态迁移,即虚拟机保存/恢复,通常是将整个虚拟机的运行状态完整保存下来,同时可以快速地恢复到原有硬件平台甚至是不同硬件平台上。在热迁移过程中,虚拟机不需要关机,恢复以后,虚拟机依旧平滑运行,用户不会察觉到任何差异。
在本实验中,我们使用两台搭载CentOS 8
操作系统的Linux
虚拟机来实现在同一个磁盘映像上的热迁移。这种情况在现实世界很常见,通常是在上一个用户的虚拟机被刮起、当前用户的虚拟机被恢复的时候,为了提高磁盘资源利用率,我们可以通过热迁移技术来使两台虚拟机相继访问同一虚拟磁盘。我们将两台虚拟机记为VM1
、VM2
,共享虚拟磁盘为./centos_disk_0.img
。
6.1 启动VM1
- 运行脚本
qemu-launch-vhost-user1.sh
6.2 启动VM2
- 创建一个空的磁盘镜像
- 运行脚本
qemu-launch-vhost-user2.sh
-
VM2
并不会启动,它在监听16666
端口,等待迁移。 -
在下图中,左边是
VM1
,右边是VM2
,我们看到此时VM2
并没有启动

6.3 热迁移
- 在启动
VM1
的终端中输入
- 稍等之后,我们看到
VM1
被暂停,VM1
的状态被完整迁移到了VM2
中

- 我们在
VM1
的monitor中输入info migrate
可以查看迁移的细节
- 我们可以看到,总共的迁移时间是12950ms,CPU中断的时间是104ms.