virtio,vhost 和vhost-user

随着qemu2.1的发布,可以看到,qemu支持了vhost-user。从介绍可以看出,这是把原来vhost-backend从kernel移到了userspace,这和原来virtio架构有什么区别呢?并且这个特性带来了怎样的改进?

virtio

在虚拟机中,可以通过qemu模拟e1000网卡,这样的经典网卡一般各种客户操作系统都会提供inbox驱动,所以从兼容性上来看,使用类似e1000的模拟网卡是非常一个不错的选择。

但是,e1000网卡上也包含了复杂的io端口,寄存器,缓存配置,虚拟机每次收发包都会引起更多的io和mmio操作,使得虚拟机频繁的陷出,最终导致网络性能不佳。

为了解决性能问题,IBM在2005年提出了virtio, 虚拟机中的半虚拟化前端驱动和主机上的后端服务简单的使用virtqueue共享队列交换数据,大幅的减少了e1000模拟时复杂的io操作,从而可以较大程度的提升虚拟网络性能。

virtio是qemu的半虚拟化驱动,guest使用virtio driver将请求发送给virtio-backend。

 

+---------+------+--------+----------+--+
|         +------+        +----------+  |
| user    |      |        |          |  |
| space   |      |        |  guest   |  |
|         |      |        |          |  |
|    +----+ qemu |        | +-+------+  |
|    |    |      |        | | virtio |  |
|    |    |      |        | | driver |  |
|    |    +------+        +-+---++---+  |
|    |                          |       |
|    |       ^                  |       |
|    v       |                  v       |
|            |                          |
+-+-----+-----------------+--+-------+--+
| |tap  |    +------------+ kvm.ko   |  |
| +-----+                 +--+-------+  |
|                kernel                 |
+---------------------------------------+

 

图中描述了的io路径:guest发出中断信号退出kvm,从kvm退出到用户空间的qemu进程。然后由qemu开始对tap设备进行读写。 可以看到这里从用户态进入内核,再从内核切换到用户态,进行了2次切换。

vhost

vhost技术对virtio-net进行了优化,在内核中加入了vhost-net.ko模块,使得对网络数据可以再内核态得到处理。

 

+---------+------+--------+----------+--+
|         +------+        +----------+  |
| user    |      |        |          |  |
| space   |      |        |  guest   |  |
|         |      |        |          |  |
|         | qemu |        | +-+------+  |
|         |      |        | | virtio |  |
|         |      |        | | driver |  |
|         +------+        +-+---++---+  |
|                               |       |
|                               |       |
|                               v       |
|                                       |
+-+-----+---+-+----+------+----+--+-----+
| |tap  |   | vhost-net.ko|    | kvm.ko |
| +---^-+   +------+----^-+    +----+---+
|     |-------|  kernel |-----------|   |
+---------------------------------------+

 

图中描述了的io路径:guest发出中断信号退出kvm,kvm直接和vhost-net.ko通信,然后由vhost-net.ko访问tap设备。 这样网络数据只需要经过从用户态到内核态的一次切换,就可以完成数据的传输。大大提高了虚拟网卡的性能。 由于这个技术中vhost-backend在内核中,所以也被叫做vhost-kernel。

virtio的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. kvm从内核切换到用户态的qemu进程;
  5. qemu将tx数据投递到tap设备;。

vhost的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. vhost-net将tx数据投递到tap设备;

vhost-user

随着技术的发展,将网络数据放入用户态处理将可以得到更灵活的形式。在原有的vhost架构中,进行了改动,增加了 一种新的vhost-backend,叫做vhost-user。

 

+---------------+------+--+----------+--+
|               +------+  +----------+  |
| user          |      |  |          |  |
| space         |      |  |  guest   |  |
|               |      |  |          |  |
|  +-+-------+  | qemu |  | +-+------+  |
|  | vhost   |  |      |  | | virtio |  |
|  | backend |  |      |  | | driver |  |
|  +---------+  +------+  +-+---++---+  |
|                               |       |
|      ^                        |       |
|      |                        v       |
|      |                                |
+------------------------------+--+-----+
|      +-----------------------+ kvm.ko |
|                              +--+-----+
|                kernel                 |
+---------------------------------------+

 

图中描述了的io路径:guest发出中断信号退出kvm,kvm直接和vhost-backend通信,然后网络数据将交由vhost-backend 进行处理。 从图中可以看出这个技术,依然是需要从用户态退出到内核,再由内核退出到用户态,这样的技术和virtio-backend有 什么区别呢?

vhost-user的io路径

  1. guest设置好tx;
  2. kick host;
  3. guest陷出到kvm;
  4. kvm将通知snabb;
  5. snabb将tx数据直接发送到nic设备。

vhost-user的提交者是Luke Gorrie,他也是snabbswitch的作者。从图上可以看到vhost-backend从原来咋kernel中的vhost-net 变成了用户空间的snabbswitch。 snabbswitch直接接管物理网卡的驱动,从而直接控制网络信息的输入输出。

snabbswitch主要使用了下面的技术来提高性能

  1. 采用了大页来作为host和vm之间通信的内存空间
  2. 用户态操作网卡,使用类似于netmap的zero copy技术来加速对物理设备的访问
  3. 使用numa技术,加快中断响应速率

值得一提的是使用snabbswitch后,不用再使用原来的tap设备模拟的网卡。

使用vhost-user技术,从虚拟机到host上实现了数据的zero copy(通过大页共享),host到nic的zero copy(snabbswitch实现的驱动),能进一步加快数据的传输。

 

 

版权属于: 云计算技术分享交流

原文地址: http://t.51gocloud.com/?p=402

posted on 2017-10-23 14:24  allcloud  阅读(1960)  评论(0编辑  收藏  举报

导航