多名稱空間結合cgroup保障儲存QoS

memblaze_2011發表於2018-07-09

6月, Step Ahead 向前一步——Memblaze 新品釋出會在北京召開,Memblaze在釋出會現場圍繞PBlaze5 910/916及510/516兩大系列NVMe SSD的能源效率、Trim保障雲業務、多名稱空間與cgroup結合保障儲存QoS等主題做了演示方案。這些方案全面展示了Memblaze新一代NVMe SSD產品的優勢,而且對於企業使用者部署和使用NVMe SSD,構建高速、高效的儲存系統同樣具有借鑑意義。

在此我們將對這些關鍵的技術細節通過系列文章解讀,本文主要介紹的是多名稱空間結合cgroup保障儲存QoS的方案。

關於多名稱空間和cgroup

多名稱空間(為方便解釋相關操作及原理,後文名稱空間會寫成namespace)是PBlaze5系列NVMe SSD的一項關鍵特性,使用者空間被多個namespace劃開。 在PBlaze5系列產品中,可以將邏輯塊按需劃分為最多32個namespace,每個namespace擁有獨立邏輯地址和NSID,獨立格式化和訪問。Controller 就是通過 NSID 來引用特定的 namespace 。

劃分了32個namespace的PBlaze5

每個namespace 都可以單獨配置硬碟的引數,如配置不同的物理扇區大小、執行trim指令、資料保護、加密等。需要指出的是多名命空間在NVMe SSD的實現原理在NVMe標準協議中有明確的定義,但是不同廠商對其有不同的解釋。

這就是多名稱空間,他為上層的資源排程機制提供了一個基礎平臺。結合cgroup就可以控制儲存的QoS。(關於多名稱空間更多細節,參見文章《實錘,PBlaze5實力演繹multiplenamespaces 功能(上)》和《實錘,PBlaze5實力演繹multiplenamespaces 功能(下)》)。

cgroup(control group)是Linux核心提供的一種可以限制、記錄、隔離程式組(process groups)所使用的物理資源(如:CPU, Memory, IO等)的機制。最初由Google的工程師提出,2007 年進入 Linux 2.6.24 核心。cgroup 也是 LXC/Docker 為實現虛擬化所使用的資源管理手段。可見cgroup對於Linux的資源管理和容器的實現都具有重要的意義,並且這是一項較為成熟的技術。

cgroup分v1和v2兩個版本,v1實現較早但是應用較為廣泛;v2則是重新設計之後的版本,該版本從Linux  4.5核心開始可以用於生產環境,並且v1和v2可以混合使用。由於當下cgroup v1版更加成熟,本文也使用v1版進行介紹。

使用cgroup之前需要介紹幾個比較重要的概念:

任務(task)。在 cgroup 中,任務就是系統的一個程式; 

控制組(control group)。控制組就是一組按照某種標準劃分的程式。cgroup 中的資源控制都是以控制組為單位實現。一個程式可以加入到某個控制組,也從一個程式組遷移到另一個控制組。一個程式組的程式可以使用 cgroup 以控制組為單位分配的資源,同時受到 cgroup 以控制組為單位設定的限制; 

層級(hierarchy)。控制組可以組織成 hierarchical 的形式,既一顆控制組樹。控制組樹上的子節點控制組是父節點控制組的孩子,繼承父控制組的特定的屬性; 

子系統(subsystem)。一個子系統就是一個資源控制器,本文介紹的方案使用的就是blkio子系統,其他的還有memory、cpu、cpuset等等子系統。子系統必須附加(attach)到一個層級上才能起作用,一個子系統附加到某個層級以後,這個層級上的所有控制族群都受到這個子系統的控制。

關於cgoup的相關資訊和使用方法都可以在其官方文件中找到,這裡不多贅述,只對blkio子系統使用進行一個介紹。blkio子系統主要功能是控制磁碟等塊裝置的效能等引數,掛載cgroup root目錄以及blkio子系統如下所示:

echo "259:0 102400" > blkio.throttle.read_bps_device
echo "259:0 10" > blkio.throttle.read_iops_device
在對應的子系統目錄下通過mkdir建立資源組,rmdir可將對應資源組刪除。
實際操作中,以讀的IOPS和頻寬為例,可以分別設定兩個引數的上限,如下所示:
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
第一條命令將259:0裝置(這裡的裝置可以是namespace,下同)的讀頻寬限定在100KB/s,第二條命令將259:0裝置讀iops限定在10。

使用者可以依照上面的命令格式對讀和寫的IOPS和頻寬分別進行設定,cgroup會依據多個閾值對裝置(這裡可以是多個1到多個namespace)的效能進行精準的控制,如此一來,即便是讀寫混合、多種I/O size混合的應用場景,NVMe SSD的QoS仍然有保障。

測試結果展示
多名稱空間結合cgroup保障儲存QoS的方案能夠實現的效果在日前Step Ahead 向前一步——Memblaze 新品釋出會上進行了詳細的展示,這裡我們對進行再次解讀。
測試條件
Server: PowerEdge R730xd
cpu:Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz
Memory:64GB
Storage:PBlaze5 910 U.2 3.84T NVMe SSD

測試軟體:fio-3.2

實驗介紹
在戴爾的R730xd上裝一塊3.84TB的PBlaze5 910 NVMe SSD,建立8個相同容量的namespace。使用fio進行測試,並對讀IOPS的控制效果,事實上使用者可以依據自身需求對寫IOPS,寫頻寬以及讀頻寬依照這個思路進行操作。

3.2 測試步驟
1) 建立8個相同容量namespace
2) 初始化處理,確保裝置進入穩態
3) 進行IO測試1
前4個namespace讀iops限制為3萬
後4個namespace讀iops限制為1萬
4KB 100%隨機讀,fio queue depth=1,300秒
4) 進行IO測試2
前4個namespace讀iops限制為6萬
後4個namespace讀iops限制為1萬
4KB 100%隨機讀,fio queue depth=16,300秒
測試結果展示

 
I/O測試1:4個namespace的IOPS被控制為1萬,另外四個控制在3萬
 
I/O測試1:4個namespace的IOPS被控制為1萬,另外四個控制在6萬
 

多名稱空間將NVMe SSD的使用者空間劃分為多個區域,不同的區域可以獨立進行Trim、格式化等操作。並且上層的一些高階功能的實現構建了一個基礎平臺,cgroup就是這樣高階功能中的代表。cgroup誕生於谷歌,並在Linux生態中實踐多年,是一項對底層硬體資源管控的成熟技術。多名稱空間與cgroup的結合是IT系統中一個軟硬體結合並充分發揮各自優勢的方案,各類虛擬化、容器、雲端計算、雲端儲存等應用場景都可以藉助這一方案保障儲存系統的QoS。

相關閱讀:

cgroup v1官方文件

https://www.kernel.org/doc/Documentation/cgroup-v1/cgroup.txt

cgroup v1中塊裝置控制文件

https://www.kernel.org/doc/Documentation/cgroup-v1/blkio-controller.txt

Cgroup與LXC簡介

http://blog.51cto.com/speakingbaicai/1359825

CGroup 介紹、應用例項及原理描述

https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html

測試結果視訊

https://www.bilibili.com/video/av26458755/



相關文章