ceph rbd diff的实现分析

ceph采用thin provisioning(精简),创建rbd后,并没有分配全部空间给该rbd,而是根据写入数据量进行分配,那么如何查看rbd占用了多大空间,就需要用到rbd diff命令。Jewel里面提供了一个新的接口去查询rbd du

 

ceph rbd命令中关于其使用规则描述:

diff [–from-snap snap-name] [–whole-object] image-spec | snap-spec

Dump a list of byte extents in the image that have changed since the specified start snapshot, or since the image was created. Each output line includes the starting offset (in bytes), the length of the region (in bytes), and either ‘zero’ or ‘data’ to indicate whether the region is known to be zeros or may contain other data.

可以指定获取从某个快照后镜像的变化,输出对象数据占用情况,未指定快照,就从镜像创建后计算。

 

例如:

查看存储池testpool中image testi的实际占用大小

1、查看基本信息

2、查看实际占用情况

3、正则表达式计算总共大小

rbd diff testpool/testi |awk '{SUM += $2} END {print SUM/1024/1024 " MB"}'

查看共享的image磁盘占用情况,基本一致

实现原理分析:

实际实现过程是查询每个对象的实际占用大小。

代码分析:

在diff_interate中几个情况的处理:

一、获取整个镜像数据信息

1、克隆卷

获取父卷的数据信息与本卷取交集信息,本卷也存在的一份新的拷贝数据,这些新的数据即为克隆卷实际占用的大小

2、非克隆卷

直接获取本卷的所有对象大小信息

二、获取镜像从某一个快照开始的数据占用

首先计算从某一个快照开始的数据,然后本卷的所有对象大小信息取交集

 

查看tgt代码,没有使用rbd diff相关的接口,集群单元测试( ./ceph_test_librbd --gtest_filter=TestLibRBD.DiffIterate*)rbd diff正常

 

问题:

如何查看到每个对象的实际使用大小?

通过每个对象元数据信息,snap_set_t结构。记录了size大小。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值