背景
在使用OpenStack虛機的過程中,經常會遇到這樣一種情況:同一個OpenStack集羣的幾臺虛機如果讀寫負荷較大,可能會導致其他虛機因爲搶佔不到後端存儲資源而反應卡頓,這個時候需要QoS的配合來限制虛機的IO速率及讀寫帶寬。
1、什麼是QoS?
QoS(Quality of Service)即服務質量,在網絡業務中,QoS包括傳輸的帶寬、時延等。
2、爲什麼要QoS?
資源總是有限的,包括網絡資源、後端存儲資源,只要存在搶佔資源的情況,就需要QoS來管理資源的分配。
3、如何做QoS?
以網絡通道連接的兩端來分,OpenStack中有前端(Front-End)QoS和後端(Back-End)QoS,前端QoS是Hypervisor來實現的,即在宿主機上設置虛擬機的 QoS,通常使用 cgroup 或者 qemu-iothrottling。後端QoS是存儲端驅動接管的,本文以前端QoS的配置及驗證爲例進行介紹。
4、前端QoS配置
(1)創建一個Cinder QoS Spec
[root@ceph-node1 ~]# cinder qos-create front_200_read_100_write consumer=front-end read_iops_sec=200 write_iops_sec=100
備註:
front_200_read_100_write是創建的QoS Spec的名稱
consumer指定該QoS Spec是由前端還是後端進行處理
read_iops_sec和write_iops_sec是限定讀及寫的IOPS上限
可以設置的上限選項爲:
total_bytes_sec: 順序讀寫總帶寬上限
read_bytes_sec: 順序讀帶寬上限
write_bytes_sec: 順序寫帶寬上限
total_iops_sec: 隨機讀寫總IOPS上限(IOPS是指每秒讀寫的次數)
read_iops_sec: 隨機讀IOPS上限
write_iops_sec: 隨機寫IOPS上限
5、創建卷類型——volume_type
[root@ceph-node1 ~]# cinder type-create type_front_200_read_100_write
6、將卷類型和後端存儲綁定——volume_type和新建的qos綁定
查看卷類型
[root@node1 ~]# cinder type-list
查看Qos
[root@node1 ~]# cinder qos-list
volume_type和qos綁定
[root@ceph-node1 ~]# cinder qos-associate 083b0556-c564-4b21-908f-c44e6e9547b0 0095370a-32b6-43f0-9347-a2900223661a
綁定命令爲cinder qos-associate <qos_specs_id> <volume_type_id>
後端存儲類型名稱查看(volume_backend_name有時候和az的名稱一樣)
[root@node1 ~]# cat /etc/cinder/cinder.conf | grep volume_backend_name | grep -v ^#
volume_backend_name = ceph
7、驗證
創建一個type_front_200_read_100_write類型的空白雲盤:
[root@ceph-node1 ~]# cinder create --display-name test_qos_disk1 --volume-type type_front_200_read_100_write 200
將剛纔創建的空白雲盤掛載到一個虛機上
[root@ceph-node1 ~]# nova volume-attach 2029f6ac-64f4-4f76-a0e1-4a9ea9adfeb9 f1a8472c-4f81-4d4a-a265-cb0232fcc1d4
掛載命令爲nova volume-attach <server_id> <volume_id>
前端QoS驗證
在虛機中對關聯QoS的空白雲盤運行fio進行IO測試,看看該雲盤是否已經被限制住IOPS了。
fio命令:
./fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=1G -filename=/dev/vdc -name=“QoS test” -iodepth=8 -numjobs=4 -group_reporting
./fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=1G -filename=/dev/vdc -name=“QoS test” -iodepth=8 -numjobs=4 -group_reporting
fio結果:
通過FIO的測試結果可以看到,前端QEMU是可以實現Limit上限維度的QoS控制的