久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

為什么分析du和df的統計結果會不一樣

171次閱讀
沒有評論

共計 4863 個字符,預計需要花費 13 分鐘才能閱讀完成。

這篇文章給大家介紹為什么分析 du 和 df 的統計結果會不一樣,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

我們常常使用 du 和 df 來獲取目錄或文件系統已占用空間的情況。但它們的統計結果是不一致的,大多數時候,它們的結果相差不會很大,但有時候它們的統計結果會相差非常大。

df 的統計結果

[root@xuexi ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 1.7G 15G 11% / tmpfs tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 ext4 239M 68M 159M 30% /boot //192.168.0.124/win cifs 381G 243G 138G 64% /mnt

du 對根目錄的統計結果

[root@xuexi ~]# du -sh / 2 /dev/null 244G /

df 中 / 的使用空間是 1.7G,但是 du 的結果卻是 244G。這里 du 的統計結果大于 df。再看看對 /boot 分區的統計結果。

[root@xuexi ~]# df -hT /boot;echo;du -sh /boot Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 ext4 239M 68M 159M 30% /boot 66M /boot

du 的結果是 66M,df 的結果是 68M,相差不大,但 df 的結果大于 du。

文件存儲和刪除的底層過程

這里簡單說明下文件系統相關的底層機制,首先說明下文件是怎么存儲到文件系統中的。假如要存儲 a.txt 到 /tmp 目錄下。

當 a.txt 文件要存儲到 /tmp 下時:

 (1). 首先從 inode table 中找一個空閑的 inode 號分配給 a.txt,例如 2222。再將 inode map(imap)中 2222 這個 inode 號標記為已使用。

 (2). 在 /tmp 的 data block 中添加一條 a.txt 文件的記錄。該記錄中包括一個指向 inode 號的指針,例如 0x2222。

 (3). 然后從 block map(bmap)中找出空閑的 data block,并開始將 a.txt 中的數據寫入到 data block 中。每寫一段空間 (ext4 每次分配一段空間) 就從 bmap 中找一次空閑的 data block,直到存完所有數據。

 (4). 設置 inode table 中關于 2222 這條記錄的 data block 指針,通過該指針可以找到 a.txt 使用了哪些 data block。

當要刪除 a.txt 文件時:

 (1). 在 inode table 中刪除指向 a.txt 的 data block 指針。這里只要一刪除,外界就找不到 a.txt 的數據了。但是這個文件還存在,只是它是被 損壞 的文件,因為沒有任何指針指向數據塊。

 (2). 在 imap 中將 2222 的 inode 號標記為未使用。于是這個 inode 號就被釋放,可以被后續的文件重用。

 (3). 刪除父目錄 /tmp 的 data block 中關于 a.txt 的記錄。這里只要一刪除,外界就看不到也找不到這個文件了。

 (4). 在 bmap 中將 a.txt 占用的 block 標記為未使用。這里被標記為未使用后,這些 data block 就可以被后續文件覆蓋重用。

考慮一種情況,當一個文件被刪除時,但此時還有進程在使用這個文件,這時是怎樣的情況呢?外界是看不到也找不到這個文件的,所以刪除的過程已經進行到了第 (3) 步。

但進程還在使用這個文件的數據,也能找到這個文件的數據,是因為進程在加載這個文件的時候就已經獲取到了該文件占用哪些 data block,雖然刪除了文件,但 bmap 中這些 data block 還沒有標記為未使用。

du 統計的原理

du 是通過 stat 命令來統計每個文件 (包括子目錄) 的空間占用總和。因為會對每個涉及到的文件使用 stat 命令,所以速度較慢。

1. 如果統計目錄下掛載了其他文件系統,那么也會對這個文件系統進行統計。例如 du -sh / 的時候,會統計所有分區的文件,包括掛載上來的。正如本文開頭統計的 / 一樣,du 的結果是 244G,明顯比 df 統計的結果大,就是因為將某個分區掛載到了 /mnt 目錄下。

## df 的統計結果  [root@xuexi ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 1.7G 15G 11% / tmpfs tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 ext4 239M 68M 159M 30% /boot //192.168.0.124/win cifs 381G 243G 138G 64% /mnt ## du 對根目錄的統計結果  [root@xuexi ~]# du -sh / 2 /dev/null 244G /

2. 如果文件被刪除,即使被其他進程引用了,du 命令也無法對其統計。因為 stat 命令找不到這個文件。

3. 可以跨分區統計某些你想統計的文件大小總和。因為它們都能被 stat 找到并統計。例如:統計 Linux 下所有 img 文件的大小。

## df 的統計結果  [root@xuexi ~]# find / -type f -name  *.img  -print0 | xargs -0 du -csh 19M /boot/initramfs-2.6.32-504.el6.x86_64.img 13M /mnt/linux 工具 /cirros-0.3.4-x86_64-disk.img 31M total

這里統計的兩個 img 文件就是在不同分區內的。

df 統計的原理

df 是讀取每個分區的 superblock 來獲取空閑數據塊、已使用數據塊,從而計算出空閑空間和已使用空間,因此 df 統計的速度極快(superblock 才占用 1024 字節)。

1. 當某個文件系統下掛載了其他分區,df 不會把這個分區也統計進去。這很容易理解,因為 df 讀取的是各自分區的 superblock,即使分區 1 掛載在分區 0 的目錄下,df 統計分區 0 的時候,也只能讀取分區 0 的 superblock。

例如,下面的 /mnt、/boot 都沒有統計在 / 中。

[root@xuexi ~]# df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 1.7G 15G 11% / tmpfs tmpfs 491M 0 491M 0% /dev/shm /dev/sda1 ext4 239M 68M 159M 30% /boot //192.168.0.124/win cifs 381G 243G 138G 64% /mnt

2. 由于 df 每次統計都是讀取 superblock,所以 df 對文件系統中的某個文件進行統計時,會自動轉為統計這個文件系統的信息。

[root@xuexi ~]# df -hT /etc/fstab Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 1.7G 15G 11% /

3.df 會統計已刪除但卻仍有進程引用的文件。

正常情況下,刪除文件會立刻釋放相關指針,并將 imap 和 bmap 中相關的位圖標記為未使用。bmap 只要一改變,文件系統立刻就能知道每個塊組中哪些數據塊是空閑的,哪些數據塊是被使用的,這些信息都會更新到分區的 superblock 中。于是 df 能立刻統計到實時的空間信息。

但是當一個文件被刪除時,如果還有進程在引用這個文件,根據前文的分析,bmap 中不會將這個文件的 data block 標記為未使用,也就不會將數據塊的使用情況更新到 superblock 中。由于 df 是根據 superblock 中空閑和使用數據塊的數量來計算空閑空間和已使用空間的,所以 df 統計的時候會將這個已被 刪除 的文件統計到已使用空間中。

例如,創建一個較大一點的文件放在 / 目錄下,并 du 和 df 統計根目錄的已使用空間。

[root@xuexi ~]# dd if=/dev/zero of=/my.iso bs=1M count=1000 [root@xuexi ~]# df -hT / Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 2.7G 14G 17% / [root@xuexi ~]# du -sh --exclude= /mnt  / 2 /dev/null 2.7G /

它們在 GB 級的單位上是相等的。現在使用一個進程來引用這個文件,然后刪除這個文件,再 du 和 df 統計。

[root@xuexi ~]# tail -f /my.iso   [root@xuexi ~]# rm -rf /my.iso [root@xuexi ~]# ls /my.iso ls: cannot access /my.iso: No such file or directory [root@xuexi ~]# du -sh --exclude= /mnt  / 2 /dev/null 1.8G / [root@xuexi ~]# df -hT / Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 2.7G 14G 17% /

可以發現,外界已經獲取不到 my.iso 文件了,所以 du 無法統計這個文件。而 df 卻將該文件大小統計進去了,因為 my.iso 占用的 data block 還未被標記為未使用。再關掉 tail 進程,然后 df 再統計空間,結果將和 du 一樣顯示為正常的大小。

[root@xuexi ~]# jobs [1]+ Running tail -f /my.iso   [root@xuexi ~]# kill %1 [root@xuexi ~]# df -hT / Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 18G 1.7G 15G 11% /

如果不知道文件系統中哪些已被刪除,但卻還被進程引用的文件,可以使用 lsof 來獲取。通過它還能獲取到文件的大小,看看到底是哪個文件在 占著茅坑以及占了多少茅坑。例如,關掉 tail 進程前,使用 lsof 查看。可以看到 tail 進程占用了 /my.iso,且這個文件的大小為 1048576000 字節。

[root@xuexi ~]# lsof | grep deleted php-fpm 12597 root txt REG 8,2 4058416 931143 /usr/sbin/php-fpm (deleted) php-fpm 12657 nobody txt REG 8,2 4058416 931143 /usr/sbin/php-fpm (deleted) php-fpm 12707 nobody txt REG 8,2 4058416 931143 /usr/sbin/php-fpm (deleted) php-fpm 12708 nobody txt REG 8,2 4058416 931143 /usr/sbin/php-fpm (deleted) tail 14437 root 3r REG 8,2 1048576000 7171 /my.iso (deleted)

關于為什么分析 du 和 df 的統計結果會不一樣就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計4863字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 沭阳县| 临湘市| 镇平县| 苍南县| 唐山市| 于都县| 绥芬河市| 涞源县| 徐汇区| 拜城县| 洞头县| 定边县| 肥东县| 北宁市| 普宁市| 勐海县| 大渡口区| 晋州市| 内乡县| 钟山县| 宣威市| 中阳县| 稻城县| 三原县| 宣武区| 榆树市| 满洲里市| 寿阳县| 平陆县| 民勤县| 特克斯县| 社会| 镇康县| 六盘水市| 射洪县| 卢氏县| 青河县| 汉寿县| 襄垣县| 武陟县| 五原县|