文件系统的各指标计算方法(参考df和sar)

df的基本打印信息如下:

文件系统           1K-块      已用      可用 已用% 挂载点
udev               10240         0     10240    0% /dev
tmpfs           26371504    323096  26048408    2% /run
/dev/sda1       47929224   6618744  38852728   15% /
tmpfs           65928756       156  65928600    1% /dev/shm
tmpfs               5120         0      5120    0% /run/lock
tmpfs           65928756         0  65928756    0% /sys/fs/cgroup
/dev/sda5      513289816     71536 487121592    1% /home

包括文件系统名字、总量、已用量、可用量、已用百分比和挂载点。通过对于df和sar相关代码的一些分析,大体的计算方法如下:

首先,通过读取“/proc/self/mountinfo”文件或者“/etc/mtab”获取文件系统基本信息,其中df使用的是前者,sar使用的是后者,以前者举例:

43 22 8:5 / /home rw,relatime shared:27 - ext4 /dev/sda5 rw,data=ordered

这是其中的一条信息,其中可以获取磁盘分区/dev/sda5和其挂载点/home,8:5是major:minor,设备的主辅ID号。知道了挂载点后,就可以使用linux系统调用statvfs获取其他信息,其中path就是挂载点,该接口的基本信息:

int statvfs(const char *path, struct statvfs *buf);
struct statvfs {
    unsigned long  f_bsize;    /* filesystem block size */
    unsigned long  f_frsize;   /* fragment size */
    fsblkcnt_t     f_blocks;   /* size of fs in f_frsize units */
    fsblkcnt_t     f_bfree;    /* # free blocks */
    fsblkcnt_t     f_bavail;   /* # free blocks for unprivileged users */
    fsfilcnt_t     f_files;    /* # inodes */
    fsfilcnt_t     f_ffree;    /* # free inodes */
    fsfilcnt_t     f_favail;   /* # free inodes for unprivileged users */
    unsigned long  f_fsid;     /* filesystem ID */
    unsigned long  f_flag;     /* mount flags */
    unsigned long  f_namemax;  /* maximum filename length */
};

这里对主要参数做一些说明:

f_bsize、f_frsize:对于绝大多数Linux系统而言,f_bsize和f_frsize的取值是相同的。然而,某些文件系统支持块片段的概念,在无需使用完整数据块的情况下,可在文件尾部分配较小的存储单元,从而避免因分配完整块而导致的空间浪费。在此类文件系统上,f_frsize和f_bsize分别表示块片段和整个块的大小。(在sar和df中,都是使用的f_frsize表示的块大小)

f_bfree、f_bavail:都表示空闲的块,但是有一些区别。许多原生UNIX和Linux文件系统,都支持为超级用户预留一部分文件系统块,如此一来,即便在文件系统空间耗尽的情况下,超级用户仍可以登录系统解决故障。如果文件系统中确有预留块,那么f_bfree和f_bavail字段间的差值则为预留块。也就是说f_bfree是root可以使用的空闲块总量,包含了f_bavail,而f_bavail是非特权用户能够使用的,是f_bfree去掉预留块。

f_files、f_ffree:与inode相关的参数,意思比较简单,就是总的inodes和空闲的inodes,f_favail参数好像不需要,只使用f_ffree就可以

下面解析df的各项打印,打印的单位的KB,说明中单位是字节,注意区别:

文件系统:从“/proc/self/mountinfo”文件或者“/etc/mtab”获取的,在上面的那条信息中就是/dev/sda5

总量(字节):f_blocks * f_frsize

已用(字节):(f_blocks - f_bfree) * f_frsize

可用(字节):f_bavail, df中的可用量不计算预留块

已用(%):(f_blocks - f_bfree)   / (f_blocks - f_bfree + f_bavail)* 100,注意该项,分母并不是总量,而是总量去掉了预留块

挂载点:从“/proc/self/mountinfo”文件或者“/etc/mtab”获取的,在上面的例子中就是/home

 

在上面的各项中,主要注意的是可用和已用的百分比,可以看到,df认为文件系统的可用量是不算预留块的,所以这两个参数都不计算预留块。但是总量却计算了预留块,这个地方比较容易产生困惑。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值