最近忙存储网关的开发,没有投放精力在Ceph和Openstack上了,这里翻出来一些之前做的项目,分享给大家。
一、QOS概况
在OpenStack H
版中块存储引入了QoS
特性,主要在Cinder
和Nova
项目中实施。
在OpenStack
的QoS
特性上,主要依赖于后段存储和前端的Hypervisor
来实现,而在Cinder
中,提供了一个QoS Spec
框架,用户可以创建一个QoS Spec
,这个Spec
说明了针对目标(后端或者前端),限制键值对(total_iops_sec=1000)
等,每个QoS Spec
与Volume Type
相联系,用户在创建一个卷时可以将该卷与一个Volume Type
联系,这样就间接使得该卷与特定QoS Spec
联系。
换句话说,该卷获得了一系列QoS
键值对,当该QoS
是面向后端时,创建卷命令会将QoS Spec
的键值对传给Cinder
的后端存储解释。当该QoS
面向前端时,在这个卷被附加到一个虚拟机上时才会被实现,比如通过QEMU
来实现。
二、当前实现
硬盘:Ceph
的RBD
提供
当前限速实现:通过Openstack Cinder
创建type
,指定QOS
来实现。具体步骤如下:
1)创建cinder volume type
1 | usage: cinder type-create <name> |
2)创建cinder的一个qos标准
1 | usage: cinder qos-create <name> <key=value> [<key=value> ...] |
[注释]
consumer:通常分为两类
- front-end:表示限速在前端hypervisor(例如Qemu)实现
- back-end:表示限速在后端存储系统实现
Libvirt/Qemu可配置qos keys:
- 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
后端可配置qos keys:
与具体的后端存储支持相关,当前Ceph不支持块设备的QOS配置,在Ceph社区已经提上日程。
3)管理cinder volume type和qos
1 | usage: cinder qos-associate <qos_specs> <volume_type_id> |
4)cinder volume attach到nova instance
attach后可以查看到这些iotune信息
1 | $ virsh dumpxml cde0ab13-ff3d-46d0-a7c6-b797f18d0465 |
三、如何动态限速磁盘?
1)根据磁盘容量动态调整
难度一般
从上诉分析知道cinder volume
的QOS设置在hypervisor Qemu
中实现,从cinder
中读取这些参数应该在Nova
的逻辑中有,我们只需要修改这部分逻辑,添加代码实现随着磁盘容量递增的QOS
即可。
2)根据系统负载动态调整
难度较大
动态调整虚拟机iotune的方法:
1. nova
的change-disk-io-tune
命令
nova
的命令中有一个change-disk-io-tune
的子命令,格式如下:
1 | $ nova help change-disk-io-tune |
通过该命令可以动态修改nova instance
中的disk iotune
限制,但它不能区分nova instance
中的具体硬盘,会把所有盘的iotune
都修改为指定值,例如:
1 | $ nova change-disk-io-tune --read_iops_sec 200 --write_iops_sec 200 --read_bytes_sec 102400 --write_bytes_sec 102400 5ceaacab-b021-4f23-ba45-579345b843a9 |
通过nova change-disk-io-tune
可以实时调整虚拟机上所有blk device
的iotune
,并立即生效。但它不能指定具体的blk device
,不符合我们的使用需求。
2. virsh
的blkdeviotune
命令
virsh
命令有disk iotune
相关的子命令,如下:
1 | $ virsh blkdeviotune --help |
通过该命令可以实时调整对应block device
的iotune
,但必须在虚拟机对应的物理机上执行该命令。
- 查看指定设备的
iotune
,命令如下:
1 | $ virsh blkdeviotune 5ceaacab-b021-4f23-ba45-579345b843a9 vdc |
- 修改指定设备的
iotune
值,命令如下:
1 | $ virsh blkdeviotune 5ceaacab-b021-4f23-ba45-579345b843a9 vdc --read_iops_sec 5000 --write_iops_sec 3000 |
通过virsh
可以实时调整虚拟机指定blk device
的iotune
,并立即生效。但如何结合需求动态调整虚拟机上磁盘的iotune
,还需深入考察。