乐趣区

关于虚拟化:virtio-12-来了龙蜥社区携手业界打造新版虚拟化-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 mailto:xuanzhuo@linux.alibaba… 起草的,引入这个个性的目标是解决 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 mailto:kangjie.xu@linux.aliba…。

置信大家不久之后就能够在新版本的 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/hig…

—— 完 ——

退出移动版