df命令查看挂盘目录大小是整个文件系统的大小还是挂载的目录的大小

原创 吴就业 140 0 2024-06-17

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/bbaac74175974ff997f307a704acca74

作者:吴就业
链接:https://wujiuye.com/article/bbaac74175974ff997f307a704acca74
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

我们自己实现的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

实际我们一个PV写了60G,一个写了50G,然后在其中一个Pod通过df命令查看输入如下:

截屏2024-06-17 18.38.03

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命令有个致命缺陷,因为是通过递归的方式统计目录大小的,如果目录下的小文件非常多, 会导致统计非常慢,例如几十秒,甚至几十分钟。

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

CXJ 2024-07-18

您好,如果pv对应的是nfs网络存储子目录,那Prometheus监控指标查询到的也是整个NFS文件系统的Size和Used,有什么办法可以监控子目录的Size和Used呢

吴就业 2024-07-18

您好,如果pv对应的是nfs网络存储子目录,那Prometheus监控指标查询到的也是整个NFS文件系统的Size和Used,有什么办法可以监控子目录的Size和Used呢

这确实是个问题,我们目前的办法是自己统计:通过一个controller然后挂盘整个nfs的根目录,去用du统计每个子目录的大小,然后上报指标。 目前想到的一个待优化的方案是:在csi驱动的node组件,通过du全量统计+eBPF实现增量统计。

文章推荐

国内docker用不了了怎么办

替换掉Docker的镜像仓库,例如可以使用AWS的ECR公开的镜像仓库,常用的基础镜像都能找到替代。

golang如何本地开发然后在远程编译运行

有时候,我们可能会遇到go项目中依赖一些底层的lib c库,这些库是只有linux环境下才有的,而我们本地开发环境一般是windwos系统或者mac os系统,我们也懒得搞一个Linux虚拟机来专门做开发,而且在虚拟机里面开发体验也确实不好,会影响效率。

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

本篇从掘金同步过来,是作者之前将博客部署在阿里云ACK上,尝试使用APISIX网关的经验分享。

Cloudflare CDN请求body被限制问题,以及http Range请求头被移除问题

对于免费用户,单个请求的最大Body大小为100mb,对于付费企业用户,最大也只有500MB。请求经过Cloudflare CDN后,Range请求头被干掉了,Cloudflare CDN请求源站的时候并没有带上Range请求头。

Go语言有前途吗?

做后台开发,不管是java还是go,都只是一门编程语言罢了,不会说做了5年的java后端研发,换成go就不会了吧,顶多花点时间学习一门语言和一些框架,把编码习惯变一变而已,在问题排查方面,需要重新学习一些工具而已。

新人成长路上,技术选型容易犯的错

技术人追求技术是好事,但应该把精力放在精益求精上,而不是追随潮流。没必要一味追求用一项技术,技术选型的目的就是选择各方面对比最适合的,这也包括开发成本、运维成本。