virtio 1.2 来了!龙蜥社区携手业界打造新版虚拟化 IO 标准
一、virtio spec 是什么?
在云计算如火如荼的今天,我们应该经常可以在云计算平台上看 "virtio" 这个词,它出现在云计算机的各种设备上:虚拟机中的 virtio 网卡驱动 宿主机或者 CIPU 上面的 virtio 设备的实现 virtio spec (规范)
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
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
Per-virtqueue reset
Shared memory resources
Object resources for inter-device sharing
Virtio-pci vendor-specific capabilities
Virtio-pci queue_notify_data optimization
二、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 就可以安全地回收队列占用的相关资源了。
之后 virtio driver 可选地进行 re-enable 操作,在操作的过程中,driver 可以给 device 新的参数来 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>。
三、高性能网络 Virtio SIG
3.1 背景
virtio 作为一个云计算大范围使用的技术,国内的各大云厂家基本都是基于它实现的,但是这么些年我们对它的反馈与参与是非常少的,基本都是拿来主义的状态。最近,我们开始注意到,阿里等国内的云厂家开始积极地参与其中,修复 bug,参与标准制定,推进实现等, 一起推广及做强云基础技术。这对于国内云技术的长远发展是非常好的一件事。希望这样的深度的参与越来越多,共同推进 virtio 的发展。为了更好地支持更多的特性和优化在龙蜥操作系统的落地,我们在龙蜥社区高性能网络SIG下组建了 virtio 兴趣小组,通过加强社区内各个 virtio 相关的团队及公司之间的合作,增强彼此在这一块的沟通和了解,从而推动 virtio 本身以及其在龙蜥更好的发展。希望后续有更多的社区伙伴来共同参与进来,也欢迎大家积极参与讨论,提问题或需求,大家以一种平等的关系共构建龙蜥社区的 virtio SIG。我们认为这是一个共赢的过程。3.2 原则
共赢、平等、开源。3.3 愿景
探索 virtio 标准的更多可能性,推进 virtio 标准实现与落地
促进技术交流
提供技术帮助 为各个伙伴提供需求输入 同步各个伙伴的开发进展 促进各个伙伴之间的合作
加入我们
欢迎大家加入高性能网络 Virtio SIG。
SIG 地址链接: https://openanolis.cn/sig/high-perf-network
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!
龙蜥社区成立的短期目标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应对方案,构建一个兼容国际 Linux 主流厂商的社区发行版。中长期目标是探索打造一个面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。
目前,Anolis OS 8.6 已发布,更多龙蜥自研特性,支持 X86_64 、RISC-V、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。
欢迎下载:https://openanolis.cn/download
加入我们,一起打造面向未来的开源操作系统!https://openanolis.cn
1.如何在 Anolis 8上部署 Nydus 镜像加速方案?
2.龙蜥社区技术委员会召开:新增4名委员、一致决议发布版本及技术治理路线等规划3.一起畅聊「云+操作系统」!龙蜥社区亮相阿里巴巴开源开放周,完整议程来了4.如何通过 open-local 玩转容器本地存储?
5.千人互动,18 位业界大咖,2022 开放原子全球开源峰会龙蜥专区总结来了