cephfs统计稀疏文件大小的脚本

背景

cephfs的df看到的是真实的容量的占用的,ll是看到文件的元数据大小的,du一般是统计文件的真实占用的大小的,但是cephfs并没有记录文件内的占用的情况,所以du无法统计到真实占用

方法

我们先拿到全部的inode编号

1
ls -i -R  /mnt > inode.list

拿到全部的对象名称

1
rados -p rbd ls > object.list

写一个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#! /bin/bash

cat inode.list|while read -r line;do

if [[ $line == *:* ]];then
echo $line
elif [[ -z $line ]];then

echo " "

else
inode=`echo $line|awk '{print $1}'`
filename=`echo $line|awk '{print $2}'`
objectpre=$(printf "%x" "$inode" )
objnum=`cat object.list|grep $objectpre|wc -l`
result=$(echo "scale=3; $objnum*4 / 1000"|bc)
result=`printf "%.3f\n" $result`
echo ${result}GB $filename
fi

done

这里我们只需要的是大概的占用情况,直接就是预估的单个对象4M的,这个属于估算的,如果想到非常精确的,那么就需要用rados -p data stat 拿到每一个对象的大小,然后在后面做计算的时候,把每个的大小加起来,这个是可以拿到精准的大小的占用的
我们这里因为文件都是大文件,只需要预估即可

总结

通过对象的统计,可以计算出文件的真实大小占用