SPDK QOS機制解析

天翼雲開發者社群發表於2022-05-18


序:

intel spdk 軟體在儲存領域應用廣泛。因其可以高效管理 linux 系統的 nvme ssd 盤,又支援 vhost-user 協議可以對接 qemu 虛擬機器,在雲端計算領域通常被用來做本地盤雲主機的儲存管理軟體。如此優秀的一款軟體,有必要仔細分析其內部的實現機制,本篇文章主要介紹 spdk qos 機制。

spdk qos 做在 bdev 層,是面向塊裝置的 qos ,不是面向客戶端的 qos 。面向客戶端的 qos 需要做在協議層,部分協議例如 iscsi 協議本身有 qos 機制,不過這部分機制不在 spdk qos 裡面討論, spdk qos 可以理解為就是 bdev qos


spdk qos 機制:

目前共支援 4 qos ,分別是 IOPS qos BPS qos BPS rqos BPS wqos 4 qos 均放在 spdk_bdev_qos->rate_limits 陣列裡面,因此新增加 qos 也很簡單,可直接在陣列裡面新增 qos 型別,比如 IOPS rqos IOPS wqos 。增加新型別 qos 後,在 bdev_qos_set_ops bdev_qos_is_iops_rate_limit qos 介面裡面也需要增加對應邏輯。

為支援多核訪問同一個 bdev qos 需求, spdk 採用 io 任務委託提交的方式向 bdev 層提交 io 。具體方式是在多個核中選取一個 io 任務提交核用於執行 bdev_io 提交,其餘未被選中的核透過 bdev_io_submit 提交 bdev_io 時,需要使用 spdk_thread_send_msg 向提交核傳送一個訊息,提交核收到訊息後使用 _bdev_io_submit 執行提交,當判斷需要 qos 時,使用 bdev_qos_io_submit qos 提交 bdev_io qos 完成限速後再透過 bdev_io_do_submit bdev 驅動提交 request 。完整的提交流程見下圖:

 

 

當多種 qos 同時配置時, qos 生效策略為都透過才算 qos 透過,其中任何一種 qos 要求不滿足,就排隊不向驅動提交。 bdev_io 向驅動提交前,和 bdev_io 從驅動返回後,每種配置的 qos 均需要更改 quota 配額。 qos 生效策略可見下圖 bdev_qos_io_submit 函式。  

觸發 bdev qos 執行的方式有兩種。一種是新 io 觸發,新 io 提交會主動觸發 qos 檢查並依次提交 qos queue 中的 io ;另一種是定時 poll ,在無新 io 下發的場景使用,原 qos queue 中的 io poll bdev_channel_poll_qos )的運作機制下進行提交,一次 poll 任務的預設間隔時間是 1ms SPDK_BDEV_QOS_TIMESLICE_IN_USEC )。

bdev qos 機制可能帶來不連續突發請求的效能抖動,若 qos 設定太小,主機每次突發請求都較大,會導致 qos poll 提交生效,某些 io 的時延可能達到 SPDK_BDEV_QOS_TIMESLICE_IN_USEC

 

spdk qos 命令:

spdk 支援動態調整 bdev qos 引數,使用 bdev_set_qos_limit 命令,若相關 limit 引數設定為 0 ,則相關 limit 取消( SPDK_BDEV_QOS_LIMIT_NOT_DEFINED ),具體命令幫助資訊如下圖。

 

實驗驗證:

理論知識分析完畢,接下來實踐一下 spdk qos 功能。模擬本地盤雲主機場景,先搭建 qemu 虛擬機器透過 vhost-user 協議跑一下環境 IO 效能。環境搭建可參考 spdk 軟體包中 doc/vhost.md 文件,步驟略過。僅介紹搭建好的環境情況如下,物理機 spdk 中建立一個 1G 大小的記憶體盤 Malloc0 ,然後透過 Vhost-BLK 掛載到虛擬機器,虛擬機器硬碟隨機讀效能約 80W IOPS

 

物理機上執行命令 bdev_set_qos_limit ,把 IOPS 限制到 1W ,執行命令如下:

然後看一下虛擬機器的效能,可以看到 IOPS 已經下降到 1W 以下,此時頻寬為 38M IOPS qos 限制正確生效。

接下來,再限制一下頻寬,看看頻寬 qos IOPS 業務的影響。把頻寬限制到 20M ,物理機上執行命令如下:

 

相對於 1W IOPS 20M 頻寬限制更嚴格。看一下環境,虛擬機器 IOPS 業務效能的確是受到更嚴格的頻寬限制影響,頻寬下降到 20M 以下, IOPS 下降到 5000 左右。頻寬 qos 限制正確生效。

 

接下來解除頻寬限制,注意限制引數填寫 0 即可。

 

可以看到 IOPS 恢復到 1W IOPS

接下來解除 IOPS 限制,注意限制引數填寫 0 即可。

 

可以看到 IOPS 恢復到 80W IOPS 。實驗完畢。

總結:

spdk qos 機制清晰明瞭,使用也很方便,能夠滿足本地盤雲主機 使用場景。但是由於不同 spdk 程式的 bdev 不能共享,因此多個 spdk 程式協作 qos 無法實現。這對希望使用 spdk 作為客服端對接分散式儲存的同學來說不是一個好訊息,當多個 spdk 客戶端使用分散式儲存提供的同一個盤時,無法正確做 qos 限速。這往往需要一個額外的 qos 方案。


雲主機:


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

相關文章