前言
有时候需要快速地了解cephfs下某个目录的使用情况,比如消耗了多少的磁盘空间,共有多少个子文件,因为目录下可能有子目录,子目录下可能又各自有子目录和文件,给统计带来了很大的不便。
对于使用的使用空间情况,可以通过du命令获取,但是该方法性能太差,对于目录结构非常深的情况,性能尤其的差。
方法
cephfs 提供了一个称为 virtual xattrs 功能获取目录的递归统计信息。
让我们一起体会下该功能的强大:
root@node-3:/var/share/ezfs/shareroot# ll
total 0
drwxrwxrwx 1 root root 1 Mar 9 21:18 ./
drwxr-xr-x 1 root root 4 Mar 9 16:29 ../
drwxrwxrwx 1 root root 126 Mar 9 21:58 nas/
root@node-3:/var/share/ezfs/shareroot/nas# ls
1 102 106 11 113 117 120 124 14 18 21 25 29 32 36 4 43 47 50 54 58 61 65 69 72 76 8 83 87 90 94 98
10 103 107 110 114 118 121 125 15 19 22 26 3 33 37 40 44 48 51 55 59 62 66 7 73 77 80 84 88 91 95 99
100 104 108 111 115 119 122 126 16 2 23 27 30 34 38 41 45 49 52 56 6 63 67 70 74 78 81 85 89 92 96
101 105 109 112 116 12 123 13 17 20 24 28 31 35 39 42 46 5 53 57 60 64 68 71 75 79 82 86 9 93 97
事实上,对于下面的126个子目录,每个目录下都有200个左右的子目录,然后下面存放有很多的文件。如果我要统计nas目录下共有多少个文件,那么du命令执行到我花儿都谢了也没返回结果。
root@node-3:/var/share/ezfs/shareroot# getfattr -d -m ceph.dir.* .
# file: .
ceph.dir.entries="1"
ceph.dir.files="0"
ceph.dir.rbytes="708822611968"
ceph.dir.rctime="1457535283.09430737000"
ceph.dir.rentries="3633611"
ceph.dir.rfiles="3608532"
ceph.dir.rsubdirs="25079"
ceph.dir.subdirs="1"
注意,我使用了getfattr命令,来获取文件系统给出的扩展属性。 很轻松的就可以得到nas目录的一些信息
*顶层目录nas下共有一个子目录
*递归来看,共有25079个子目录
*顶层目录nas下文件个数位0
*递归来看,该目录下文件的总数3608532
*递归来统计,该目录消耗的总空间为708822611968字节
其他
对代码感兴趣的同学,可以阅读内核的fs/ceph/xattr.c 除此以外,python-ceph这个deb提供了一些访问cephfs的函数接口。