天天看点

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、查看基本信息

ceph rbd diff的实现分析

2、查看实际占用情况

ceph rbd diff的实现分析

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

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

ceph rbd diff的实现分析

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

ceph rbd diff的实现分析

实现原理分析:

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

ceph rbd diff的实现分析

代码分析:

ceph rbd diff的实现分析

在diff_interate中几个情况的处理:

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

1、克隆卷

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

2、非克隆卷

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

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

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

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

问题:

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

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

继续阅读