博客 / 詳情

返回

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 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...

—— 完 ——

user avatar skystarslgd 頭像 rivers_chaitin 頭像 juicefs 頭像
3 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.