在云计算如火如荼的今天,我们应该经常可以在云计算平台上看 "virtio" 这个词,它出现在云计算机的各种设备上:
它是怎样的一种存在,在虚拟化的技术领域扮演着一种怎样的角色呢?
virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。
一般来说,我们所说的 virtio 包含三个部分:
所以 virtio spec 是 virtio 的灵魂。
virto spec 通过定义一套 virtqueue 机制,实现 guest 和 host 的通信。这套机制可以应用于多种设备(网络设备、块设备等)。所以 virtio spec 发展出了多种设备,基本完成了对于虚拟化场景下各种设备的覆盖。
virtio 是一种半虚拟化的技术,如果对于设备进行全虚拟化,hypervisor 就要对于所有的硬件请求指令进行截获,这对于性能的影响是巨大的。
但是实际上 guest 本质上是一个 host 上的进程,它与 hypervisor 进行交互并不用这么麻烦,完全可以基于进程之间的通信方式进行交互。只是这种方式要 guest 进行配合。所以基于此实现的 virtio 可以获得更高的性能。这也就是 virtio 获得广泛支持的原因。
2012 最早由 Rusty Russell 起草的并不是一个正式的规范。后续 virtio spec 由 virtio 技术委员会负责,并发布了多个版本。在委员会的主持下,社区的广泛参与下,不断地为 virtio spec 增加新的特性与能力,目前 virtio spec 已经推进到 v1.2 版本。
首先 virtio spec 1.2 对更早的版本是完全兼容的,virtio spec 定义的所有特性都是通过 features 进行协商的,所以在实现上可以平滑地进行过渡。并不存在升级之后不同版本之间的不兼容问题。
在设备方面 virtio spec 1.2 新支持了一些设备: virtio-pmem,virtio-fs, virtio-rpmb......
一些主流的设备也支持了一些新的特性,比如 virtio-net 增加了这些新的特性:
virtio spec 1.2 中的 Per-virtqueue reset 是由阿里云的 Xuan Zhuo xuanzhuo@linux.alibaba.com起草的,引入这个特性的目的是解决 virtio-net 不支持队列级别的 reset 操作的问题。这在很多现代化的网卡中是一个比较常见的功能, 是实现很多功能的基础能力, 为了让 virtio-net 支持更多能力, 这个特性的引入是必须的。但是 Per-virtqueue reset 并不只限于 virtio-net 这一种设备,它是一个 virtio 的基础能力,相信其它的 virtio 设备也会慢慢支持这个 feature。
Per-virtqueue reset 由 driver 针对某一个队列发起,基于某一种 transport(比如 PCIe) 通知 device。device 停止使用队列,driver 在 reset 之后可以重新 re-enable 队列。virtio spec 定义了这个过程中详细的交互流程和信息。
以下是 virtio spec 中定义的详细流程:
对于现代的很多硬件设备来讲,对于队列进行 reset 是一个比较常见的功能,所以这个功能的引入让 virtio 设备更加现代化。早期 virtio 的出现是伴随着高性能的需求而来的,我们原来更加关注它在性能上的基本功能,一些高级功能并不重视。per-virtqueue reset 让 virtio 对于队列的使用更加灵活,譬如我们可以基于 per-vertqueue reset 实现下面两个功能:
1.调整 virtio-net 网卡队列的 ring size。在 virtio-net 的场景下,基于 per-virtqueue reset 我们可以实现网卡队列 ring size 的调整。目前一般的网卡都支持使用 ethtool -G eth0 rx <new size> tx <new size>来调整队列的大小,但是原来的 virtio-net 一直是不支持这样一个简单的功能的,现在基于 per-virtqueue reset,我们很快就可以在 Linux 下使用这个命令来调整队列的大小。
2.支持 AF_XDP,扩展云上应用的边界。除了应用于上述简单的场景之外,我们还可以在更高级的场景应用到这个功能。per-virtqueue reset 也可以视作一种资源的快速回收机制。比如在 virtio-net 的情况下,我们必须要等待收到新的数据包或者硬件完成数据包的发送才能完成对于 buffer 资源的回收。而现在基于 per-virtqueue reset,driver 可以不用被动地等待而是可以主动调用 reset 快速地让 device 释放对于某个队列上的 buffer 资源的占用,实现资源的快速回收。这可以让 virtio-net 支持 AF_XDP 这样的高级功能,实现在 linux 内核框架下的高性能收发包。
更多的应用场景还等待大家的探索。
以上都是 virtio spec 的定义,Xuan Zhuo 作为这个 feature 的起草人,在这个 feature 正式进入 virtio spec 之后,就开始向 Linux kernel 社区开源相关的实现,其它 device 后端实现也都在推进中:
virtio 作为一个云计算大范围使用的技术,国内的各大云厂家基本都是基于它实现的,但是这么些年我们对它的反馈与参与是非常少的,基本都是拿来主义的状态。最近,我们开始注意到,阿里等国内的云厂家开始积极地参与其中,修复 bug,参与标准制定,推进实现等, 一起推广及做强云基础技术。这对于国内云技术的长远发展是非常好的一件事。希望这样的深度的参与越来越多,共同推进 virtio 的发展。
为了更好地支持更多的特性和优化在龙蜥操作系统的落地,我们在龙蜥社区高性能网络 SIG 下组建了 virtio 兴趣小组,通过加强社区内各个 virtio 相关的团队及公司之间的合作,增强彼此在这一块的沟通和了解,从而推动 virtio 本身以及其在龙蜥更好的发展。希望后续有更多的社区伙伴来共同参与进来,也欢迎大家积极参与讨论,提问题或需求,大家以一种平等的关系共构建龙蜥社区的 virtio SIG。我们认为这是一个共赢的过程。
原则:共赢、平等、开源。
愿景:
SIG 成员:丁雪峰(阿里)、衡琪(阿里)、许康捷(阿里)、马江英(Intel CNDP)、 顾正国(云豹智能)、 张明礼(云豹智能)、 杨涛(云豹智能)、孙传明(云豹智能)、龚有华(云脉芯联)、孟祥宏(云脉芯联)、陈杨(云脉芯联)、钱荣(云脉芯联)。
欢迎大家加入高性能网络 Virtio SIG。
领取专属 10元无门槛券
私享最新 技术干货