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