一、virtio spec 是什么?
在云计算如火如荼的今天,我们应该经常可以在云计算平台上看 "virtio" 这个词,它出现在云计算机的各种设备上:
它是怎样的一种存在,在虚拟化的技术领域扮演着一种怎样的角色呢?
virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。
一般来说,我们所说的 virtio 包含三个部分:
- 虚拟机中的 virtio 网卡驱动
- 宿主机或者 CIPU 上面的 virtio 设备的实现
- virtio spec (规范)
前面两个是 virtio 在不同的操作系统及计算机模拟器中具体实现的 driver 和 device,driver 和 device 如何实现并没有严格的规定,基于其所处的环境不同而有所区别,但是 driver 与 device 之间的交互必须严格遵守 virtio spec 的定义。这样才能保证所有的 OS 在不同的 host 上的模拟器里面都可以正常运行。
所以 virtio spec 是 virtio 的灵魂。
virto spec 通过定义一套 virtqueue 机制,实现 guest 和 host 的通信。这套机制可以应用于多种设备(网络设备、块设备等)。所以 virtio spec 发展出了多种设备,基本完成了对于虚拟化场景下各种设备的覆盖。
1.1 那我们为什么选择它呢?
virtio 是一种半虚拟化的技术,如果对于设备进行全虚拟化,hypervisor 就要对于所有的硬件请求指令进行截获,这对于性能的影响是巨大的。
但是实际上 guest 本质上是一个 host 上的进程,它与 hypervisor 进行交互并不用这么麻烦,完全可以基于进程之间的通信方式进行交互。只是这种方式要 guest 进行配合。所以基于此实现的 virtio 可以获得更高的性能。这也就是 virtio 获得广泛支持的原因。
1.2 virtio spec 的历史
2012 最早由 Rusty Russell 起草的并不是一个正式的规范。后续 virtio spec 由 virtio 技术委员会负责,并发布了多个版本。在委员会的主持下,社区的广泛参与下,不断地为 virtio spec 增加新的特性与能力,目前 virtio spec 已经推进到 v1.2 版本。
1.3 virtio spec 1.2 关键时间点
- 25 Jan 2022 virtio spec 冻结
- 10 May 2022 - 08 June 2022 Public Review
- 01 July 2022 virtio v1.2 正式版本完成 html
- 15 July 2022 virtio v1.2 正式对外宣布发布 announcement
经过半年多的努力,vrtio 1.2 终于正式发布了。
1.4 virtio spec 1.2 新特性
首先 virtio spec 1.2 对更早的版本是完全兼容的,virtio spec 定义的所有特性都是通过 features 进行协商的,所以在实现上可以平滑地进行过渡。并不存在升级之后不同版本之间的不兼容问题。
在设备方面 virtio spec 1.2 新支持了一些设备: virtio-pmem,virtio-fs, virtio-rpmb......
一些主流的设备也支持了一些新的特性,比如 virtio-net 增加了这些新的特性:
- UDP segmentation offload
- Receive Side Scaling
- Per-packet hash reporting
- Guest hdrlen optimization
- Link speed and duplex reporting
此外, virtio core 还增加了一些新的基础特性:
- Per-virtqueue reset
- Shared memory resources
- Object resources for inter-device sharing
- Virtio-pci vendor-specific capabilities
- Virtio-pci queue_notify_data optimization
总体而言,这次 virtio spec 1.2 的发布带来了很多让人激动的新特性。相信等这些功能正式实现之后,我们会感受到更加现代化的 virtio。同时也是一个驱动各个厂家完善自家 virtio 实现的机会。
二、Per-virtqueue reset
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。
2.1 Per-virtqueue reset 的实现过程
Per-virtqueue reset 由 driver 针对某一个队列发起,基于某一种 transport(比如 PCIe) 通知 device。device 停止使用队列,driver 在 reset 之后可以重新 re-enable 队列。virtio spec 定义了这个过程中详细的交互流程和信息。
以下是 virtio spec 中定义的详细流程:
- driver 基于 transport 通知 device 某个指定的队列要 reset。
- device 收到请求之后设置 reset 状态为 1,停止此队列的所有操作,包括中断等,并设置队列的所有的状态到初始值。在 device 完成 reset 操作之前,返回给 driver 的 reset 状态都是 1,直到 reset 操作完成。reset 完成之后 reset 及 enable 的值都要设置成 0。
- driver 在检查到队列的 reset 状态变成 0 之后,就表示device reset 操作已经完成了。这个时候开始,driver 就可以安全地回收队列占用的相关资源了。
到此 driver 对于队列的 reset 操作就已经完成了。
- 之后 virtio driver 可选地进行 re-enable 操作,在操作的过程中,driver 可以给 device 新的参数来 re-enable 这个队列。比如新的队列大小。
以上是一个完整的 reset & re-enable 的过程,理论上 re-enable 是可选的。
2.2 Per-virtqueue reset 的意义
对于现代的很多硬件设备来讲,对于队列进行 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 内核框架下的高性能收发包。
更多的应用场景还等待大家的探索。
2.3 实现及进展
以上都是 virtio spec 的定义,Xuan Zhuo作为这个 feature 的起草人,在这个 feature 正式进入 virtio spec 之后,就开始向 Linux kernel 社区开源相关的实现,其它 device 后端实现也都在推进中:
- virtio core 支持 per-virtqueue reset 功能的 patch set 近期应该可以进入 linux 内核主线,这个 patch set 里面包含 virtio-net 支持 ring size 的实现。
- virtio-net 支持 AF_XDP 的实现也会近期开源到社区。
- qemu/vhost-user(DPDK)/vhost-kernel 的后端实现也在推进中 @Kangjie Xu <kangjie.xu@linux.alibaba.com>。
相信大家不久之后就可以在新版本的 Qemu 及 linux kernel 上体验到这个功能了。
三、高性能网络 Virtio SIG
3.1 背景
virtio 作为一个云计算大范围使用的技术,国内的各大云厂家基本都是基于它实现的,但是这么些年我们对它的反馈与参与是非常少的,基本都是拿来主义的状态。最近,我们开始注意到,阿里等国内的云厂家开始积极地参与其中,修复 bug,参与标准制定,推进实现等, 一起推广及做强云基础技术。这对于国内云技术的长远发展是非常好的一件事。希望这样的深度的参与越来越多,共同推进 virtio 的发展。
为了更好地支持更多的特性和优化在龙蜥操作系统的落地,我们在龙蜥社区高性能网络SIG下组建了 virtio 兴趣小组,通过加强社区内各个 virtio 相关的团队及公司之间的合作,增强彼此在这一块的沟通和了解,从而推动 virtio 本身以及其在龙蜥更好的发展。希望后续有更多的社区伙伴来共同参与进来,也欢迎大家积极参与讨论,提问题或需求,大家以一种平等的关系共构建龙蜥社区的 virtio SIG。我们认为这是一个共赢的过程。
3.2 原则
共赢、平等、开源。
3.3 愿景
- 探索 virtio 标准的更多可能性,推进 virtio 标准实现与落地
- 促进技术交流
- 提供技术帮助
- 为各个伙伴提供需求输入
- 同步各个伙伴的开发进展
- 促进各个伙伴之间的合作
四、SIG 成员
丁雪峰(阿里)、衡琪(阿里)、许康捷(阿里)、马江英(Intel CNDP)、 顾正国(云豹智能)、 张明礼(云豹智能)、 杨涛(云豹智能)、孙传明(云豹智能)、龚有华(云脉芯联)、孟祥宏(云脉芯联)、陈杨(云脉芯联)、钱荣(云脉芯联)。
加入我们
欢迎大家加入高性能网络 Virtio SIG。
SIG 地址链接:
https://openanolis.cn/sig/high-perf-network
—— 完 ——
加入社群
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
关于龙蜥社区
龙蜥社区(OpenAnolis)由企事业单位、高等院校、科研单位、非营利性组织、个人等在自愿、平等、开源、协作的基础上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、开放的Linux 上游发行版社区及创新平台。
龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。
目前,Anolis OS 8.6 已发布,更多龙蜥自研特性,支持 X86_64 、RISC-V、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。
欢迎下载:
https://openanolis.cn/download
加入我们,一起打造面向未来的开源操作系统!