Cinder LVM Oversubscription in thin provisioning
目录
Oversubscription in thin provisioning
- Cinder spec: Over Subscription in Thin Provisioning https://review.openstack.org/#/c/129342/12/specs/kilo/over-subscription-in-thin-provisioning.rst
- cinder bp: Over subscription in thin provisioning https://blueprints.launchpad.net/cinder/+spec/over-subscription-in-thin-provisioning
所谓 Oversubscription in thin provisioning,就相当于是 Thin Provisioning Storage Pool 的超分比限制,防止 Thin Provisioning Storage Pool 被无限放大。对应的配置项是 max_over_subscription_ratio,默认值为 20.0。e.g.
[lvm-1]
volume_group = centos
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_backend_name = lvm-1
iscsi_helper = tgtadm
iscsi_protocol = iscsi
lvm_max_over_subscription_ratio = 25.0
功能生效的地方是 Cinder Scheduler Filter capacity_filter,代码如下:
# cinder/scheduler/filters/capacity_filter.py
# Only evaluate using max_over_subscription_ratio if
# thin_provisioning_support is True. Check if the ratio of
# provisioned capacity over total capacity has exceeded over
# subscription ratio.
if (thin and backend_state.thin_provisioning_support and
backend_state.max_over_subscription_ratio >= 1):
provisioned_ratio = ((backend_state.provisioned_capacity_gb +
requested_size) / total)
LOG.debug("Checking provisioning for request of %s GB. "
"Backend: %s", requested_size, backend_state)
if provisioned_ratio > backend_state.max_over_subscription_ratio:
msg_args = {
"provisioned_ratio": provisioned_ratio,
"oversub_ratio": backend_state.max_over_subscription_ratio,
"grouping": grouping,
"grouping_name": backend_state.backend_id,
}
LOG.warning(
"Insufficient free space for thin provisioning. "
"The ratio of provisioned capacity over total capacity "
"%(provisioned_ratio).2f has exceeded the maximum over "
"subscription ratio %(oversub_ratio).2f on %(grouping)s "
"%(grouping_name)s.", msg_args)
return False
如果 provisioned_ratio > backend_state.max_over_subscription_ratio 为 True 则表示当前 provisioned 的比率已经大于 Oversubscription in thin provisioning 设定的比率了,所以当前 Cinder Backend 无法继续创建新的 Volume。
那么,provisioned_ratio 是怎么得到的呢?代码如下:
provisioned_ratio = ((backend_state.provisioned_capacity_gb + requested_size) / total)
首先弄清楚这几个变量的含义及取值:
# cinder/utils.py
# provisioned_capacity_gb is the apparent total capacity of
# all the volumes created on a backend, which is greater than
# or equal to allocated_capacity_gb, which is the apparent
# total capacity of all the volumes created on a backend
# in Cinder. Using allocated_capacity_gb as the default of
# provisioned_capacity_gb if it is not set.
allocated_capacity_gb = capability.get('allocated_capacity_gb', 0)
provisioned_capacity_gb = capability.get('provisioned_capacity_gb',
allocated_capacity_gb)
thin_provisioning_support = capability.get('thin_provisioning_support',
False)
total_capacity_gb = capability.get('total_capacity_gb', 0)
free_capacity_gb = capability.get('free_capacity_gb', 0)
官方说明:
total_capacity: This is an existing parameter already reported by the driver. It is the total physical capacity. Example: Assume backend A has a total physical capacity of 100G.available_capacity: This is an existing parameter already reported by the driver. It is the real physical capacity available to be used. Example: Assume backend A has a total physical capacity of 100G. There are 10G thick luns and 20G thin luns (10G out of the 20G thin luns are written). In this case, available_capacity = 100 - 10 -10 = 80G.used_capacity: This parameter is calculated by the difference between total_capacity and available_capacity. It is used below for calculating used ratio.volume_size: This is an existing parameter. It is the size of the volume to be provisioned.provisioned_capacity: This is a new parameter. It is the apparent allocated space indicating how much capacity has been provisioned. Example: User A created 2x10G volumes in Cinder from backend A, and user B created 3x10G volumes from backend A directly, without using Cinder. Assume those are all the volumes provisioned on backend A. The total provisioned_capacity will be 50G and that is what the driver should be reporting.allocated_capacity: This is an existing parameter. Cinder uses this to keep track of how much capacity has been allocated through Cinder. Example: Using the same example above for provisioned_capacity, the allocated_capacity will be 20G because that is what has been provisioned through Cinder. allocated_capacity is documented here to differentiate from the new parameter provisioned_capacity.
简要说明:
allocated_capacity_gb:实际已分配的容量。provisioned_capacity_gb:已置备的容量,大于或等于 allocated_capacity_gb。
注:所谓已置备是存储领域的专业术语,表示逻辑上的已经分配出去的虚拟容量,可能是精简置备的也可能是厚置备的。需要与实际已分配的容量作一个区分。total_capacity_gb:实际的总容量。free_capacity_gb:实际剩余的容量。
在 LVM Driver 中的含义:
allocated_capacity_gb: 在 cinder 中分配的 cinder volume 总大小free_capacity_gb: vg 中空闲的容量provisioned_capacity_gb: vg 上面分配的总大小,因为文件稀疏(Thin)的问题,这个值可能很大total_capacity_gb: vg 容量的总大小max_over_subscription_ratio: 最大超配比
回过头来在看看这条计算公式:
provisioned_ratio = ((backend_state.provisioned_capacity_gb + requested_size) / total)
provisioned_ratio 就是当前已经被置备的容量的比率,包括精简置备或厚置备的情况,也就是我们不希望它太过于大的比率。理应小于 max_over_subscription_ratio。
但有一个问题需要注意,在 LVMDriver 中使用 Thin provisioning 时,provisioned_capacity_gb 马上就等于 VG 的总容量。你会发现虽然你还没有创建任何 Volume,但 provisioned_capacity_gb 就已经等于 VG 的 Size 了。代码如下:
# cinder/volume/drivers/lvm.py
if self.configuration.lvm_mirrors > 0:
total_capacity =\
self.vg.vg_mirror_size(self.configuration.lvm_mirrors)
free_capacity =\
self.vg.vg_mirror_free_space(self.configuration.lvm_mirrors)
provisioned_capacity = round(
float(total_capacity) - float(free_capacity), 2)
elif self.configuration.lvm_type == 'thin':
total_capacity = self.vg.vg_thin_pool_size
free_capacity = self.vg.vg_thin_pool_free_space
provisioned_capacity = self.vg.vg_provisioned_capacity
else:
total_capacity = self.vg.vg_size
free_capacity = self.vg.vg_free_space
provisioned_capacity = round(
float(total_capacity) - float(free_capacity), 2)
这是因为 Cinder 假设,当你使用 LVM Thin provisioning 的时候,那么整个 VG 都应该是 Thin provisioning 的,不存在 Thin 和 Thick 混合的情况,否则无法正确进行容量的计算。因此,当我们使用 LVM Thin provisioning 时,切记要划分一个干净的 VG 给 LVM Backend,否则就会出现资源计算错误的问题。
Cinder LVM Oversubscription in thin provisioning的更多相关文章
- 学习OpenStack之 (2):Cinder LVM 配置
0.背景 OpenStack 中的实例是不能持久化的,cinder服务重启,实例消失.如果需要挂载 volume,需要在 volume 中实现持久化.Cinder提供持久的块存储,目前仅供给虚拟机挂载 ...
- Cinder LVM backend cinder-volume service down
目录 文章目录 目录 问题 调查 解决 问题 [stack@manager ~]$ cinder service-list +------------------+------------------ ...
- volume image
http://docs.openstack.org/user-guide/cli_nova_launch_instance_from_volume.html http://docs.openstack ...
- cinder介绍及使用lvm本地存储
1.cinder简介 Cinder提供持久的块存储,目前仅供给虚拟机挂载使用.它并没有实现对块设备的管理和实际服务,而是为后端不同的存储结构提供了统一的接口,不同的块设备服务厂商在 Cinder 中实 ...
- Cinder 架构分析、高可用部署与核心功能解析
目录 文章目录 目录 Cinder Cinder 的软件架构 cinder-api cinder-scheduler cinder-volume Driver 框架 Plugin 框架 cinder- ...
- Docker实践(3)—浅析device mapper的thin provision
thin provision是在 kernel3.2 中引入的.它主要有以下一些特点: (1)允许多个虚拟设备存储在相同的数据卷中,从而达到共享数据,节省空间的目的: (2)支持任意深度的快照.之前的 ...
- LVM学习
LVM Logical Volume Manager Volume management creates a layer of abstraction over physical storage, a ...
- LVM学习笔记
LVM Logical Volume Manager Volume management creates a layer of abstraction over physical storage, a ...
- LVM实践
[root@ftp:/root] > fdisk -l Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units = ...
随机推荐
- STUN/TURN服务器搭建
目录 STUN/TURN服务器搭建 编译安装 配置使用 添加用户 启动server 测试 开机启动 参考 STUN/TURN服务器搭建 编译安装 编译安装 OpenSSL: sudo apt-get ...
- Linux下文档与目录结构
目录分类 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来实现磁盘读写. ...
- IIS 自动化发布工具实现-Manager【二】
思路: 1.首先是要获取项目的差异文件列表,实现方式是通过cmd 执行git 命令. git pull 拉取最新代码 git log 查看git签入记录 ,使用参数 --pretty=for ...
- 用Python做一个飞机大战游戏
基于pygame的一款小游戏 这是我上半年做的一款小游戏,但是一直忘记了,现在才上传代码. github项目地址:StarMan 代码基于pygame,Python版本3.5.2运行正常. 游戏很简单 ...
- Kostya the Sculptor(贪心
这题本来 想二分.想了很久很久,解决不了排序和二分的冲突. 用贪心吧.. 题意: 给你n个长方形,让你找出2个或1个长方体,使得他们拼接成的长方体的内接球半径最大(这是要求最短边越大越好)( ...
- Beyond Compare 4提示已经过了30天试用期
打开Beyond Compare 4,提示已经超出30天试用期限制,解决方法:1.修改C:\Program Files\Beyond Compare 4\BCUnrar.dll ,这个文件重命名或者直 ...
- Seafile和Nextcloud相比较哪个好用
面对大量的照片视频,备份资料成了很多网友的刚需.但现在各大免费网盘,关闭地关闭,收费的收费,自建网盘成了一个不得已的选择.可以自建私有网盘的网盘程序最出名的要数Seafile和Nextcloud,一款 ...
- Node.js Websocket 区分不同的用户
实现ws://serverIP:port/:param1/:param2 .通过param1,param2来管理不同的ws回话,以便实现群发和指定用户的消息推送 npm install ws --sa ...
- easyui-filebox上传图片到阿里
应用场景:在fixbox图片上传时在预览图片img标签底下点击按钮触发一下函数 参考:https://www.cnblogs.com/awzf/p/9843814.html js //修改该时上传产品 ...
- C语言calloc()函数:分配内存空间并初始化——stm32中的应用
经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~ 头文件:#include <stdlib.h> calloc() 函数用来动态地分配内 ...