文件系統的各指標計算方法(參考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認爲文件系統的可用量是不算預留塊的,所以這兩個參數都不計算預留塊。但是總量卻計算了預留塊,這個地方比較容易產生困惑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章