KVM
virtio
virtio是linux下的半虚拟化框架,半虚拟化相对于全虚拟化而已,即虚机需要感知当前的虚拟化状态,通过虚机中的driver配合host上的device进行通信实现全功能的虚拟化,主要作用在于:1)统一的驱动,之前各个虚拟化系统vmware,xen,kvm都有自己的块设备,网络设备的驱动;2)提供统一接口实现缓存buffer的发布和使用;3)设备发现和配置。
其中virtqueue作为guest os内存的一部分用来实现前后端(guest os和qemu)的连接,virtqueue的内存分布内部通过vring的一个数据结构来提炼。用户通过get_buf和kick实现数据从guest os向qemu的写入,通过get_buf实现数据从qemu的读取。
有兴趣可以阅读想法提出者 Rusty Russell 的论文 https://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf
回到之前的对比,guest virtio driver通过访问port地址空间向qemu的virtio device发送IO发起消息。而设备通过读写irqfd或者IOCTL fd_vm将I/O的完成情况通知给Guest的驱动。irqfd和ioeventfd是KVM为用户程序基于内核eventfd机制提供的通知机制,以实现异步的IO处理(这样发起IO请求的vcpu将不会阻塞)。guest通过kvm提供的通知机制向qemu发送I/O消息,从guest切换到kvm,再由kvm切换到用户空间的qemu进程,qemu完成对设备的读写。
vhost
相比于virtio减少了一次上下文切换(host切回到guest),vhost-net负责将虚机的报文从NIC发出。
vhost-user
vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。vhost-backend从原来kernel中的vhost-net变成了用户空间的snabbswitch,snabbswitch直接接管物理网卡的驱动,从而直接控制网络信息的输入输出。snabbswitch主要使用了下面的技术来提高性能:
- 采用了大页来作为host和vm之间通信的内存空间
- 用户态操作网卡,使用类似于netmap的zero copy技术来加速对物理设备的访问
- 使用numa技术,加快中断响应速率
值得一提的是使用snabbswitch后,不用再使用原来的tap设备模拟的网卡。
使用vhost-user技术,从虚拟机到host上实现了数据的zero copy(通过大页共享),host到NIC的zero copy(snabbswitch实现的驱动),能进一步加快数据的传输。
DPDK support
DPDK便是一个在用户态可以直接操作物理网卡的库函数,它和vhost-user结合便可以实现类似于snabbswitch一样性能强劲的用户态交换机了。2015年6月16日dpdk vhost-user ports特性合并到了ovs社区,dpdkvhostuser port将创建unix socket将虚机的virtio-net虚拟网卡的网卡缓冲区共享给物理机上的ovs port设备。
Virtio specification
virtqueue
包括三部分,分别是描述符表,可用环(buffer),已用环(buffer):
• Descriptor Table
• Available Ring
• Used Ring
参阅:
1. qemu-kvm. git://git.kernel.org/pub/scm/virt/kvm/qemu-kvm.git
2. Linux-2.6{/virt/kvm/*, arch/x86/kvm/*, drivers/virtio/*, drivers/block/virtio_blk.c, drivers/vhost/*}
3. Intel® Virtualization Technology for Directed I/O
4. Intel® 64 and IA-32 Architectures Software Developer’s Manual 3B.
5. Towards Virtual Passthrough I/O on Commodity Devices. 2008.
6. kvm: the Linux Virtual Machine Monitor. 2007.
7. virtio: Towards a De-Facto Standard For Virtual I/O Devices. 2008
8. High Performance Network Virtualization with SR-IOV. 2010.
9. QEMU, a Fast and Portable Dynamic Translator. 2005.
10. https://blog.csdn.net/wj_j2ee/article/details/7978259
11. https://blog.csdn.net/quqi99/article/details/47321023
12. https://blog.csdn.net/qq_15437629/article/details/77899905