vhost:一种 virtio 高性能的后端驱动实现

什么是 vhost

vhost 是 virtio 的一种后端实现方案,在 virtio 简介中,我们已经提到 virtio 是一种半虚拟化的实现方案,需要虚拟机端和主机端都提供驱动才能完成通信,通常,virtio 主机端的驱动是实现在用户空间的 qemu 中,而 vhost 是实现在内核中,是内核的一个模块 vhost-net.ko。为什么要实现在内核中,有什么好处呢,请接着往下看。

为什么要用 vhost

在 virtio 的机制中,guest 与 用户空间的 Hypervisor 通信,会造成多次的数据拷贝和 CPU 特权级的上下文切换。例如 guest 发包给外部网络,首先,guest 需要切换到 host kernel,然后 host kernel 会切换到 qemu 来处理 guest 的请求, Hypervisor 通过系统调用将数据包发送到外部网络后,会切换回 host kernel , 最后再切换回 guest。这样漫长的路径无疑会带来性能上的损失。

vhost 正是在这样的背景下提出的一种改善方案,它是位于 host kernel 的一个模块,用于和 guest 直接通信,数据交换直接在 guest 和 host kernel 之间通过 virtqueue 来进行,qemu 不参与通信,但也没有完全退出舞台,它还要负责一些控制层面的事情,比如和 KVM 之间的控制指令的下发等。

vhost 的数据流程

下图左半部分是 vhost 负责将数据发往外部网络的过程, 右半部分是 vhost 大概的数据交互流程图。其中,qemu 还是需要负责 virtio 设备的适配模拟,负责用户空间某些管理控制事件的处理,而 vhost 实现较为纯净,以一个独立的模块完成 guest 和 host kernel 的数据交换过程。

vhost 与 virtio 前端的通信主要采用一种事件驱动 eventfd 的机制来实现,guest 通知 vhost 的事件要借助 kvm.ko 模块来完成,vhost 初始化期间,会启动一个工作线程 work 来监听 eventfd,一旦 guest 发出对 vhost 的 kick event,kvm.ko 触发 ioeventfd 通知到 vhost,vhost 通过 virtqueue 的 avail ring 获取数据,并设置 used ring。同样,从 vhost 工作线程向 guest 通信时,也采用同样的机制,只不过这种情况发的是一个回调的 call envent,kvm.ko 触发 irqfd 通知 guest。

总结

vhost 与 kvm 的事件通信通过 eventfd 机制来实现,主要包括两个方向的 event,一个是 guest 到 vhost 方向的 kick event,通过 ioeventfd 实现;另一个是 vhost 到 guest 方向的 call event,通过 irqfd 实现。

代码分析整个通信的流程: http://royluo.org/2014/08/22/vhost/

PS:对云计算感兴趣的小伙伴可以关注我的微信公众号:aCloudDeveloper,专注云计算领域,坚持分享干货。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

Lepus搭建企业级数据库全方位监控系统

Lepus(天兔)数据库企业监控系统是一套由专业DBA针对互联网企业开发的一款专业、强大的企业数据库监控管理系统,企业通过Lepus可以对数据库的实时健康和各种...

1715
来自专栏Rainbond开源「容器云平台」

技术解读Rainbond Service Mesh微服务架构_开源PaaS Rainbond

1862
来自专栏子勰随笔

SDK开发经验之文档

2148
来自专栏博客园迁移

git代码统计

统计某人的代码提交量,包括增加,删除: git log --author="$(git config --get user.name)" --pretty=tf...

1012
来自专栏开源优测

有那么几张图给大家看看

701
来自专栏全华班

微信小程序开发环境搭建

微信小程序是当前程序员讨论的相当火的一个名词了,当前App开发人员有个担心,微信小程序的到来会不会给移动端App带来一个寒冬。不管微信小程序是否能颠覆当今的开发...

7136
来自专栏皮振伟的专栏

[kvm][qemu]影响虚拟化热迁移的设备

前言 虚拟化场景下,热迁移、HA都会受到部分设备的影响。设备的实现上,包含“透传”、“直通”、“passthrough”,基本上就限制了虚拟机的迁移能力。 作...

4956
来自专栏大葡萄元元

开发一款app从PHP到API接口

答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发。(别去纠结 GTK、WinBinder)

4011
来自专栏ytkah

测试了小程序的内嵌网页总结几点

  11月2日深夜微信团队宣布小程序内嵌页面开放了,很多开发者已经测试了小程序的内嵌网页,他们总结了以下几点: 1、内嵌网页的域名需要在小程序管理后台设置为业务...

3285
来自专栏BestSDK

一提交代码系统就崩溃? 给你8个避免此尴尬的技巧

当一群人作为一个整体同时进行一个程序的编写时,每个个体都会面临两方面的权衡: ●个人部分的实现——你需要保证你负责的代码部分可以正常运行; ● 整体部分的实现—...

3727

扫码关注云+社区

领取腾讯云代金券