virtio 1.2 來了!龍蜥社群攜手業界打造新版虛擬化 IO 標準

OpenAnolis小助手發表於2022-08-15

一、virtio spec 是什麼?

在雲端計算如火如荼的今天,我們應該經常可以在雲端計算平臺上看 "virtio" 這個詞,它出現在雲端計算機的各種裝置上:

virtio 1.2 來了!龍蜥社群攜手業界打造新版虛擬化 IO 標準

它是怎樣的一種存在,在虛擬化的技術領域扮演著一種怎樣的角色呢?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 的歷史

virtio 1.2 來了!龍蜥社群攜手業界打造新版虛擬化 IO 標準

2012 最早由 Rusty Russell 起草的並不是一個正式的規範。後續 virtio spec 由 virtio 技術委員會負責,併發布了多個版本。在委員會的主持下,社群的廣泛參與下,不斷地為 virtio spec 增加新的特性與能力,目前 virtio spec 已經推進到 v1.2 版本。

virtio 1.2 來了!龍蜥社群攜手業界打造新版虛擬化 IO 標準

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 起草的,引入這個特性的目的是解決 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 。

相信大家不久之後就可以在新版本的 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 地址連結:

—— 完 ——



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2910420/,如需轉載,請註明出處,否則將追究法律責任。

相關文章