一起聊聊Ceph RBD和QEMU塊設(shè)備Qos測(cè)試
關(guān)于ceph的qos
Ceph,作為一個(gè)高度可擴(kuò)展的分布式存儲(chǔ)系統(tǒng),已經(jīng)成為云計(jì)算和大數(shù)據(jù)時(shí)代的關(guān)鍵基石。隨著企業(yè)和組織對(duì)數(shù)據(jù)存儲(chǔ)的需求日益增長(zhǎng),Ceph 通過(guò)其強(qiáng)大的特性,如可靠性、伸縮性和性能,滿足了這些需求。然而,隨著集群規(guī)模的擴(kuò)大和工作負(fù)載的多樣性,如何確保資源的有效分配和性能隔離成為了一個(gè)重要議題。在這個(gè)背景下,Ceph 的 Quality of Service (QoS) 功能顯得尤為重要。
QoS 在 Ceph 中的實(shí)現(xiàn),特別是在其 RADOS Block Device (RBD) 模塊中,提供了一種機(jī)制來(lái)控制和限制存儲(chǔ)資源的使用,如 IOPS(每秒輸入輸出操作次數(shù))和帶寬。這對(duì)于在多租戶環(huán)境中維持服務(wù)質(zhì)量,防止資源過(guò)度使用或“鄰居噪音”問(wèn)題至關(guān)重要。通過(guò)精確地配置 QoS 參數(shù),管理員可以為不同的虛擬機(jī)、容器或應(yīng)用分配適當(dāng)?shù)拇鎯?chǔ)資源,確保系統(tǒng)的整體性能和響應(yīng)性。
在本文中,我們將深入探討 Ceph RBD 的 QoS 特性,重點(diǎn)關(guān)注如何驗(yàn)證和量化 RBD QoS 設(shè)置的效果。通過(guò)一系列的測(cè)試和分析,我們將展示 QoS 參數(shù)如何影響 RBD 性能,以及如何根據(jù)特定的工作負(fù)載和性能要求調(diào)整這些參數(shù)。無(wú)論是對(duì)于 Ceph 新手還是資深用戶,了解和應(yīng)用 RBD 的 QoS 功能都是提高存儲(chǔ)系統(tǒng)效率和可靠性的關(guān)鍵步驟。
測(cè)試環(huán)境
- 操作系統(tǒng):ubuntu 20.04
- 內(nèi)核:5.4.0-163-generic
- CPU / 內(nèi)存:32C / 128G
- 硬盤:10T
- ceph:17.2.5 quincy (stable)
測(cè)試流程
- 拉起一個(gè)使用ceph rbd存儲(chǔ)的虛擬機(jī)
- 使用fio測(cè)試無(wú)限速情況下iops和bps
- 開(kāi)啟 image qos iops限速 測(cè)試rbd的iops
- 開(kāi)啟 image qos bps限速 測(cè)試rbd的bps
- 開(kāi)啟 pool qos iops限速 測(cè)試rbd的iops
- 開(kāi)啟 pool qos bps限速 測(cè)試rbd的bps
- 測(cè)試qemu對(duì)塊設(shè)備進(jìn)行bps限速
- 測(cè)試qemu對(duì)塊設(shè)備進(jìn)行iops限速
- 刪除qos再次進(jìn)行測(cè)試,驗(yàn)證已經(jīng)恢復(fù)
測(cè)試步驟
在ceph 14版本開(kāi)始支持rbd的qos 詳細(xì)配置參數(shù)可以參考https://docs.ceph.com/en/latest/rbd/rbd-config-ref/
圖片
ceph rbd的qos是在librbd上進(jìn)行限制的。
查看當(dāng)前鏡像的qos配置
rbd -p libvirt-pool config image ls scan.img|grep qos
查看存儲(chǔ)池的qos配置,存儲(chǔ)池的qos限制的是所有鏡像總的qos不超過(guò)設(shè)置的值
rbd config pool ls libvirt-pool|grep qos
可以看到默認(rèn)不設(shè)置的時(shí)候bps和iops都為0,表示默認(rèn)不限速。rbd_qos_schedule_tick_min=50表示qos的最小調(diào)度間隔是50毫秒,每隔50毫秒檢查一次當(dāng)前的io操作是否符合qos配置。這里解釋下rbd_qos_write_iops_burst_secnotallow=1表示在達(dá)到寫入 IOPS 限制(由 rbd_qos_write_iops_limit 參數(shù)設(shè)置)之后,RBD 圖像可以以突發(fā)模式繼續(xù)寫入操作的時(shí)間長(zhǎng)度。這個(gè)突發(fā)模式允許 IOPS 短時(shí)間內(nèi)超過(guò)設(shè)定的限制值,為的是處理短暫的高負(fù)載情況,而不是持續(xù)的高速寫入。這個(gè)參數(shù)的值設(shè)定為 1 秒,意味著在觸發(fā) IOPS 限制后,寫入操作可以在接下來(lái)的 1 秒內(nèi)保持較高的 IOPS,之后將被限制回設(shè)定的 rbd_qos_write_iops_limit 值,同樣對(duì)bps的burst_seconds的意義也是一樣。
圖片
解釋下相關(guān)參數(shù):
- IOPS:每秒 I/O 數(shù)(任何類型的 I/O)
- read IOPS:每秒讀取 I/O 數(shù)
- write IOPS:每秒寫入 I/O 數(shù)
- bps:每秒字節(jié)數(shù)(任何類型的 I/O)
- read bps:每秒讀取的字節(jié)數(shù)
- write bps:每秒寫入的字節(jié)數(shù)
使用fio進(jìn)行讀取寫入測(cè)試
fio 是一個(gè)靈活的 I/O 性能測(cè)試工具,廣泛用于評(píng)估磁盤和文件系統(tǒng)的性能。以下是一個(gè)基本的示例,展示如何使用 fio 進(jìn)行隨機(jī)讀寫測(cè)試:
fio --name=randrw_test --ioengine=libaio --iodepth=1 --rw=randrw --rwmixread=50 --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
參數(shù)解釋
- --name=randrw_test: 測(cè)試的名稱。
- --ioengine=libaio: 使用 Linux AIO(異步 I/O)作為 I/O 引擎。
- --iodepth=1: I/O 深度,這里設(shè)置為 1,意味著每個(gè) job 在任何時(shí)刻只有一個(gè) I/O 操作在等待。
- --rw=randrw: 測(cè)試類型為隨機(jī)讀寫。
- --rwmixread=50: 讀寫混合比例,這里設(shè)置為 50%,意味著讀操作和寫操作各占 50%。
- --bs=4k: 塊大小設(shè)置為 4KB。
- --direct=1: 使用直接 I/O,繞過(guò)緩存。
- --size=1G: 每個(gè) job 測(cè)試文件的大小。
- --numjobs=4: 同時(shí)運(yùn)行的 job 數(shù)量。
- --runtime=60: 測(cè)試運(yùn)行時(shí)間,這里設(shè)置為 60 秒。
- --group_reporting: 作為一個(gè)組來(lái)報(bào)告所有 job 的結(jié)果。
在不進(jìn)行qos限速的情況下,我使用fio在rbd鏡像存儲(chǔ)的虛擬機(jī)里進(jìn)行隨機(jī)讀寫測(cè)試
rbd perf image iostat --pool libvirt-pool
圖片
開(kāi)啟 image qos iops限制此鏡像的iops為100 測(cè)試scan.img的iops
rbd -p libvirt-pool config image set scan.img rbd_qos_iops_limit 100
再次在scan.img所在的虛擬機(jī)上進(jìn)行隨機(jī)讀寫測(cè)試
fio --name=randrw_test --ioengine=libaio --iodepth=1 --rw=randrw --rwmixread=50 --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
查看iops限速后的結(jié)果
rbd perf image iostat --pool libvirt-pool
可以看到效果很明顯,iops讀寫不超過(guò)100
圖片
開(kāi)啟 image qos bps限制此鏡像的bps為100KiB/s 測(cè)試scan.img的bps
rbd -p libvirt-pool config image set scan.img rbd_qos_iops_limit 0
rbd -p libvirt-pool config image set scan.img rbd_qos_bps_limit 100000
再次在scan.img所在的虛擬機(jī)上進(jìn)行隨機(jī)寫測(cè)試
fio --name=randrw_test --ioengine=libaio --iodepth=1 --rw=randwrite --rwmixread=50 --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
查看bps限速后的結(jié)果
rbd perf image iostat --pool libvirt-pool
可以看到效果很明顯,寫吞吐不超過(guò)100KiB/s
圖片
后面單獨(dú)對(duì)讀寫的iops和bps各進(jìn)行了測(cè)試,發(fā)現(xiàn)符合預(yù)期。
開(kāi)啟 pool qos iops限速 測(cè)試存儲(chǔ)池所有鏡像的iops
rbd -p libvirt-pool config image set scan.img rbd_qos_bps_limit 0
rbd config pool set libvirt-pool rbd_qos_iops_limit 200
圖片
再次在scan.img所在的虛擬機(jī)上進(jìn)行隨機(jī)讀寫測(cè)試
fio --name=randrw_test --ioengine=libaio --iodepth=1 --rw=randrw --rwmixread=50 --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
這里發(fā)現(xiàn)對(duì)于pool層面的iops限速?zèng)]什么效果
圖片
開(kāi)啟 pool qos bps限速 測(cè)試存儲(chǔ)池所有鏡像的bps
rbd config pool set libvirt-pool rbd_qos_iops_limit 0
rbd config pool set libvirt-pool rbd_qos_bps_limit 1000000
再次在scan.img所在的虛擬機(jī)上進(jìn)行隨機(jī)寫測(cè)試
fio --name=randrw_test --ioengine=libaio --iodepth=1 --rw=randwrite --rwmixread=50 --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
這里發(fā)現(xiàn)對(duì)于pool層面的bps限速也沒(méi)什么效果
圖片
后面單獨(dú)對(duì)pool層面分別進(jìn)行讀、寫的iops和bps,發(fā)現(xiàn)限速也沒(méi)什么效果
測(cè)試qemu對(duì)塊設(shè)備進(jìn)行bps限速
可以通過(guò)下面命令查看當(dāng)前虛擬機(jī)的qos,這里查看scan虛擬機(jī)vdb磁盤的qos,也就是我們剛才測(cè)試rbd qos的那個(gè)磁盤,0表示不限速
virsh blkdeviotune scan vdb
圖片
對(duì)scan虛擬機(jī)的vdb進(jìn)行bps限制為5MiB/s
virsh blkdeviotune scan vdb --total-bytes-sec 5000000 --live
圖片
查看bps限速后的結(jié)果,iops實(shí)際不超過(guò)5MiB/s
測(cè)試qemu對(duì)塊設(shè)備進(jìn)行iops限速
對(duì)scan虛擬機(jī)的vdb進(jìn)行iops限制
virsh blkdeviotune scan vdb --total-bytes-sec 0 --live
virsh blkdeviotune scan vdb --total-iops-sec 1000 --live
在scan虛擬機(jī)里對(duì)其進(jìn)行隨機(jī)讀寫測(cè)試
fio --name=Test --ioengine=libaio --iodepth=64 --rw=randrw --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
圖片
查看iops限速后的結(jié)果,iops實(shí)際不超過(guò)1000
刪除qos再次進(jìn)行測(cè)試
再次在scan.img所在的虛擬機(jī)上進(jìn)行隨機(jī)讀寫測(cè)試
fio --name=Test --ioengine=libaio --iodepth=64 --rw=randrw --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
圖片
測(cè)試結(jié)論
對(duì)于ceph rbd qos的使用,還是建議在image層面進(jìn)行bps和iops的限速,pool層面的限速效果不明顯。當(dāng)然也可以使用qemu在塊設(shè)備上做虛擬機(jī)磁盤的io限制,使用qemu做qos的優(yōu)點(diǎn)是本地硬盤也可以進(jìn)行限速,而ceph rbd的qos對(duì)象只是ceph集群中的rbd鏡像。