免费下载!由 O’Reilly 出版的《NGINX 完全指南》中文版已正式上线 了解详情
写点什么

virtio 1.2 来了!龙蜥社区携手业界打造新版虚拟化 IO 标准

  • 2022-08-17
    北京
  • 本文字数:3609 字

    阅读完需:约 12 分钟

virtio 1.2 来了!龙蜥社区携手业界打造新版虚拟化 IO 标准

一、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


virtio 作为一个云计算大范围使用的技术,国内的各大云厂家基本都是基于它实现的,但是这么些年我们对它的反馈与参与是非常少的,基本都是拿来主义的状态。最近,我们开始注意到,阿里等国内的云厂家开始积极地参与其中,修复 bug,参与标准制定,推进实现等, 一起推广及做强云基础技术。这对于国内云技术的长远发展是非常好的一件事。希望这样的深度的参与越来越多,共同推进 virtio 的发展。


为了更好地支持更多的特性和优化在龙蜥操作系统的落地,我们在龙蜥社区高性能网络 SIG 下组建了 virtio 兴趣小组,通过加强社区内各个 virtio 相关的团队及公司之间的合作,增强彼此在这一块的沟通和了解,从而推动 virtio 本身以及其在龙蜥更好的发展。希望后续有更多的社区伙伴来共同参与进来,也欢迎大家积极参与讨论,提问题或需求,大家以一种平等的关系共构建龙蜥社区的 virtio SIG。我们认为这是一个共赢的过程。


原则:共赢、平等、开源。


愿景:

  • 探索 virtio 标准的更多可能性,推进 virtio 标准实现与落地

  • 促进技术交流

  • 提供技术帮助

  • 为各个伙伴提供需求输入

  • 同步各个伙伴的开发进展

  • 促进各个伙伴之间的合作


SIG 成员:丁雪峰(阿里)、衡琪(阿里)、许康捷(阿里)、马江英(Intel  CNDP)、 顾正国(云豹智能)、 张明礼(云豹智能)、 杨涛(云豹智能)、孙传明(云豹智能)、龚有华(云脉芯联)、孟祥宏(云脉芯联)、陈杨(云脉芯联)、钱荣(云脉芯联)。


欢迎大家加入高性能网络 Virtio SIG。


SIG 地址链接:https://openanolis.cn/sig/high-perf-network

2022-08-17 10:022921

评论

发布
暂无评论
发现更多内容

论文复现丨基于ModelArts进行图像风格化绘画

华为云开发者联盟

人工智能 华为云 12 月 PK 榜

TypeScript 前端工程最佳实践

京东科技开发者

typescript 前端 前端开发 编程语言】

低代码多分支协同开发的建设与实践

阿里巴巴终端技术

前端 低代码

车载LED显示屏的4大性能指标

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

4年“落子”8大城市,骥翀氢能产业布局背后精心下好“商业模式”先手棋

硬科技星球

MySql索引下推知识分享

京东科技开发者

数据库 后端 索引 MySQL 数据库 索引原理

2022中国产业数字化发展成熟度行业指数分析—— 重视差异,结合自身要素禀赋,推进产业精细化治理

易观分析

产业 产业数字化

这一篇让你搞懂电商平台中的商品 SPU 和 SKU

产品海豚湾

产品经理 产品设计 商品管理 电商平台 需求分析

如何使用火焰图对 Rust 程序进行性能和内存占用分析

Databend

企业大数据价值最大化的关键因素

元年技术洞察

大数据 数据中台 数字化转型

带你读AI论文丨针对文字识别的多模态半监督方法

华为云开发者联盟

人工智能 华为云 文字识别 12 月 PK 榜

校招面试真题 | 你的期望薪资是多少?为什么?

霍格沃兹测试开发学社

技术分享 | 测试的本质是什么?

霍格沃兹测试开发学社

数据人PK也无人,为什么业务部门的数据需求都是急活?

雨果

数据开发 数据工程师 数据服务

教你用Python实现BMI计算器

小院里的霍大侠

Python 实战案例 初学者 入门实战

校招面试真题 | 你的期望薪资是多少?为什么?

测试人

如何在云原生环境中实现安全左移?

SEAL安全

云原生 安全 DevSecOps 12 月 PK 榜

跨平台应用开发进阶(三十七)uni-app前端监控方案 Sentry 探究

No Silver Bullet

uni-app sentry 12月月更 前端监控方案

网络ping不通,试试这8招

华为云开发者联盟

开发 网络 服务器 华为云 12 月 PK 榜

weidl x DeepRec:热门微博推荐框架性能提升实战

阿里云大数据AI技术

性能优化 AI技术 推荐引擎 12 月 PK 榜

学生管理系统架构文档

闲人Eric

架构实战营

如何通过Java提取PDF中的图片

Geek_249eec

Java PDF 图片

这个团队敢闯、会创,北京交通大学团队结合昇思MindSpore技术助力打造“智慧安全交通”

Geek_2d6073

跨平台应用开发进阶(三十四) :uni-app 应用 Universal Link 实现 iOS 微信分享

No Silver Bullet

uni-app universal link 跨平台应用 12月月更 iOS 微信分享

跨平台应用开发进阶(三十六) :uniapp使用uni.request请求报错{“errMsg“:“request:fail abort statusCode:-1“}的解决办法

No Silver Bullet

uni-app 12月月更 跨平台应用开发 statusCode:-1“ request:fail abort

头像类NFT的未来,实际价值在哪里?

博文视点Broadview

MyBatis是如何初始化的

华为云开发者联盟

Java 开发 华为云 12 月 PK 榜

计算机科学通识-01-电子计算机发展史

邱比特讲编程

计算机基础 计算机 计算机教育

virtio 1.2 来了!龙蜥社区携手业界打造新版虚拟化 IO 标准_文化 & 方法_丁雪峰_InfoQ精选文章