我们自己实现的k8s csi驱动,将一个nfs文件系统(总大小是1TB),划分多个目录每个目录当成一个PV(卷), 每个PV的大小是50GB。我们想统计每个PV的真实用量,但我们使用df命令查看挂盘目录的总可用空间是整个nfs文件系统的 总大小,那么df命令查看到的已使用量也是整个nfs文件系统的已使用磁盘空间吗?
我们做了个实验,通过我们写的csi驱动,申请了两个PV(通过PVC申请,对应nfs文件系统上不同的目录), 这两个PV分别被两个单副本的服务挂载使用。
我们分别进入这两个服务的Pod,使用dd命令快速写一个大文件:
dd if=/dev/urandom of=/data/big-file.img bs=1G count=50
if=/dev/urandom
使用随机数of=/data/big-file.img
写到哪个文件bs=1G
块大小为1Gcount=50
写50次。(50*1G就是50G)
实际我们一个PV写了60G,一个写了50G,然后在其中一个Pod通过df命令查看输入如下:
df命令输出的已使用110G,所以是总的已使用的nfs磁盘空间。
df命令的效果等同于代码中调用statfs或statvfs系统调用。
执行df命令,它会读取并解析/etc/mtab
文件(或/proc/mounts
文件)来获取当前挂载的文件系统信息。
对于NFS文件系统,df命令会调用系统调用(statfs或statvfs)来获取文件系统的磁盘空间使用情况。
这些系统调用会通过NFS协议与NFS服务器通信,获取文件系统的相关信息,包括已用空间、可用空间、总空间和使用百分比。
结论是:df命令获取的是整个nfs文件系统的磁盘空间使用情况,而不是我们挂盘的目录。
那么,怎么获取挂盘目录的大小呢?
答案是du命令,du命令用于计算目录或文件的磁盘使用情况,它会递归地遍历目录结构,并计算每个文件和子目录的大小,最后汇总并显示总的磁盘使用情况。
# du -h /data
60G /data
但使用du命令有个致命缺陷,因为是通过递归的方式统计目录大小的,如果目录下的小文件非常多, 会导致统计非常慢,例如几十秒,甚至几十分钟。
您好,如果pv对应的是nfs网络存储子目录,那Prometheus监控指标查询到的也是整个NFS文件系统的Size和Used,有什么办法可以监控子目录的Size和Used呢
这确实是个问题,我们目前的办法是自己统计:通过一个controller然后挂盘整个nfs的根目录,去用du统计每个子目录的大小,然后上报指标。 目前想到的一个待优化的方案是:在csi驱动的node组件,通过du全量统计+eBPF实现增量统计。