背景
由于Ceph存儲(chǔ)和Nova計(jì)算節(jié)點(diǎn)是混合部署的,而且虛擬機(jī)的數(shù)據(jù)卷是共用Ceph的Volume存儲(chǔ)池旋圆。難免會(huì)出現(xiàn)集群中某一臺(tái)虛擬機(jī)的數(shù)據(jù)卷io飚高的情況界睁,造成其他虛擬機(jī)iowait跟著飚高前域。出現(xiàn)這種情況對(duì)于io比較敏感的業(yè)務(wù)是災(zāi)難性的尔店。大部分情況,業(yè)務(wù)虛擬機(jī)會(huì)隨著磁盤(pán)io下降自動(dòng)恢復(fù)欢伏。但是很多情況我們并不希望集群內(nèi)出現(xiàn)這種io資源搶占的情況入挣。
方案
第一種
對(duì)于io密集型的虛擬機(jī),我們通常采用高性能的存儲(chǔ)集群來(lái)滿足此類(lèi)業(yè)務(wù)的需求硝拧。
Ceph方面
利用SSD硬盤(pán)或者高性能硬盤(pán)創(chuàng)建一個(gè)新的存儲(chǔ)池径筏,手動(dòng)修改CRush,將新硬盤(pán)關(guān)聯(lián)到新存儲(chǔ)池
OpenStack方面
- 配置cinder.conf河爹,創(chuàng)建一個(gè)新的volume-backend
- 創(chuàng)建新的volume-type匠璧,io高密集的卷創(chuàng)建在新的volume-type里面
第二種
對(duì)于Ceph存儲(chǔ)本身是低成本的構(gòu)建架構(gòu)桐款,沒(méi)有SSD或者高性能硬盤(pán)時(shí)咸这,只能通過(guò)限制虛擬機(jī)對(duì)于數(shù)據(jù)卷的讀寫(xiě)io或者速率了。
Ceph方面
沒(méi)有對(duì)于配置魔眨,目前我用的Jewel版本暫時(shí)不支持RBD的Qos設(shè)置媳维,后面新版本也許支持
OpenStack方面
1. Qos策略
Cinder的Qos支持前端和后端兩種策略,前端是在qemu中實(shí)現(xiàn)遏暴,后端是在存儲(chǔ)集群上實(shí)現(xiàn)侄刽。由于Ceph不支持,那我們就只能在前端實(shí)現(xiàn)
目前前端qemu支持配置的qos key如下:
- total_bytes_sec: the total allowed bandwidth for the guest per second
- read_bytes_sec: sequential read limitation
- write_bytes_sec: sequential write limitation
- total_iops_sec: the total allowed IOPS for the guest per second
- read_iops_sec: random read limitation
- write_iops_sec: random write limitation
2. 實(shí)現(xiàn)方法
通過(guò)調(diào)用libvirt接口朋凉,對(duì)數(shù)據(jù)卷添加了iotune信息州丹,如下:
創(chuàng)建標(biāo)準(zhǔn)和關(guān)聯(lián)qos
# cinder qos-create middleRW.limit consumer="front-end" read_iops_sec=300 write_iops_sec=300 read_bytes_sec=104857600 write_bytes_sec=62914560
# cinder qos-associate <qos_specs> <volume_type_id>
libvirt中對(duì)數(shù)據(jù)卷的限制
</disk>
<disk type='network' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<auth username='cinder'>
<secret type='ceph' uuid='48baec00-46f8-4aa1-908f-c7991961b022'/>
</auth>
<source protocol='rbd' name='volumes/volume-756ed2a4-5c54-4b02-956f-e1ec371a2c58'>
<host name='10.33.64.100' port='6789'/>
<host name='10.33.64.101' port='6789'/>
<host name='10.33.64.102' port='6789'/>
<host name='10.33.64.103' port='6789'/>
<host name='10.33.64.104' port='6789'/>
</source>
<backingStore/>
<target dev='sdb' bus='scsi'/>
<iotune>
<read_bytes_sec>104857600</read_bytes_sec>
<write_bytes_sec>41943040</write_bytes_sec>
<read_iops_sec>300</read_iops_sec>
<write_iops_sec>300</write_iops_sec>
</iotune>
<serial>756ed2a4-5c54-4b02-956f-e1ec371a2c58</serial>
<alias name='scsi0-0-0-1'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
3. 簡(jiǎn)單測(cè)試
限制之前
# dd bs=1M count=4k if=/dev/zero of=test conv=fdatasync
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 35.2682 s, 122 MB/s
寫(xiě)限制在40M/s,基本滿足需求
# dd bs=1M count=4k if=/dev/zero of=test conv=fdatasync
4096+0 records in
4096+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 102.72 s, 41.8 MB/s
其它
當(dāng)然也可以用libvirt的blkdeviotune
命令對(duì)虛擬機(jī)做io限制杂彭,這樣不光可以對(duì)數(shù)據(jù)卷做限制墓毒,也可以對(duì)虛擬機(jī)的根盤(pán)做個(gè)性化配置。
# virsh blkdeviotune myinstances sda --read-bytes-sec 104857600 --write-bytes-sec 41943040 --read-iops-sec 300 --write-iops-sec 300 --read-bytes-sec-max 104857600 --write-bytes-sec-max 41943040 --group-name drive-scsi0-0-0-1 --read-bytes-sec-max-length 1 --write-bytes-sec-max-length 1 --read-iops-sec-max-length 1 --write-iops-sec-max-length 1
# virsh blkdeviotune 8 sdb
total_bytes_sec: 0
read_bytes_sec : 104857600
write_bytes_sec: 41943040
total_iops_sec : 0
read_iops_sec : 300
write_iops_sec : 300
total_bytes_sec_max: 0
read_bytes_sec_max: 10485760
write_bytes_sec_max: 4194304
total_iops_sec_max: 0
read_iops_sec_max: 30
write_iops_sec_max: 30
size_iops_sec : 0
group_name : drive-scsi0-0-0-1
total_bytes_sec_max_length: 0
read_bytes_sec_max_length: 1
write_bytes_sec_max_length: 1
total_iops_sec_max_length: 0
read_iops_sec_max_length: 1
write_iops_sec_max_length: 1