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操作,从而可以较大程度的提升虚拟网络性能。

paravirtualization

作为对比,从下面简单的iperf测试中,我们就能看出两者的性能差距:

With virtio

Without virtio

vhost

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

virtio_vhostnet

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将部分virio驱动的操作从用户态移到内核态,减少了用户态/内核态切换时间和包的拷贝次数,从而更进一步的提升了性能, 下面的网络延时测试可以看出vhost的优势:

vhost_virtio_host

vhost-user

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

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

转载时必须以链接形式注明原始出处及本声明。


### VirtioVhost VDPA 技术原理 #### Virtio 技术概述 Virtio 是一种用于半虚拟化的 I/O 设备框架,旨在提高性能并简化管理。该标准定义了一组通用接口,允许客户机操作系统与宿主机之间高效通信。在 `virtio-user` 模式下,Virtio 设备被挂载到 DPDK 内部模拟的 vdev 总线之上[^1]。 ```c struct virtio_net_config { uint8_t mac[6]; }; ``` #### Vhost 架构解析 为了进一步优化数据传输效率,引入了 vhost 协议作为前端驱动程序后端处理单元之间的桥梁。具体来说,在 Linux 系统上实现了两种主要形式:vhost-net (基于内核模块) 及其变体 vhost-user (利用 Unix 域套接字)[^1]。这两种机制都支持通过 ioctl 或者 unix socket 方式来进行 virtqueue 配置、内存映射设置以及 eventfd 发送等操作。 #### VDPA 标准介绍 VDPA(VIRTIO Data Path Acceleration)是一种新型加速技术,它扩展了传统的 Virtio 接口来提供硬件卸载能力。借助于特定网卡的支持,可以显著减少 CPU 开销并提升吞吐量表现。相比于纯软件实现方案而言,VDPA 能够更好地满足高性能应用场景需求。 ### 配置指南 对于上述三种技术的实际应用: - **安装依赖包** 安装必要的工具链服务组件之前,请确保目标平台已准备好相应的开发环境。 - **创建网络命名空间** 使用命令行工具如 iproute2 创建独立的工作区以便后续测试验证工作顺利开展。 - **加载相应模块** 对于某些发行版,默认情况下可能并未开启全部特性集;此时可通过 modprobe 加载缺失部分。 - **启动服务进程** 启动 QEMU/KVM 实例或其他兼容 hypervisor 平台,并指定合适的参数选项以启用所需功能。 ```bash modprobe vhost_vdpa ip netns add test_ns qemu-system-x86_64 ... -device ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值