df命令與du命令查詢結(jié)果不一致

1.前言

今早服務(wù)器有告警短信,提示主機(jī)磁盤空間已滿,上機(jī)之后使用df命令查看磁盤確實(shí)滿了,但當(dāng)我用du命令想查看具體是哪個(gè)文件夾過大的時(shí)候發(fā)現(xiàn)根本沒有,統(tǒng)計(jì)出來的文件都很小,全家一起根本填不滿磁盤。
所以在網(wǎng)上查了一下,然后自己模擬一遍記個(gè)筆記。

2.命令原理

2.1 df命令

df命令使用的是statfs這個(gè)系統(tǒng)調(diào)用,直接讀取分區(qū)的超級(jí)塊信息獲取分區(qū)使用情況。它的數(shù)據(jù)是基于分區(qū)元數(shù)據(jù)的,所以只能針對(duì)整個(gè)分區(qū)。由于df直接讀取超級(jí)塊,所以運(yùn)行速度不受文件多少影響。

2.2 du命令

du命令會(huì)對(duì)待統(tǒng)計(jì)文件逐個(gè)調(diào)用fstat,獲取文件大小。它的數(shù)據(jù)是基于文件獲取的,所以有很大的靈活性,不一定非要針對(duì)一個(gè)分區(qū),可以跨越多個(gè)分區(qū)操作。如果針對(duì)的目錄中文件很多,du速度就會(huì)很慢了。

3.情況模擬

首先查看當(dāng)前磁盤情況,然后新建一個(gè)大小為1G的文件,模擬當(dāng)時(shí)的日志。


模擬1.png

可以看到現(xiàn)在df和du命令查看結(jié)果是一致的。
模擬一下有某個(gè)程序占用這個(gè)文件,然后再將文件刪除,看看結(jié)果如何。


模擬2.png

這次情況不一樣了,df顯示根目錄下已經(jīng)占用了19G,但du命令已經(jīng)看不到那個(gè)1G的文件了。
根本原因在于tail程序占用了1G.file這個(gè)文件句柄,所以即便刪除了這個(gè)文件,超級(jí)塊信息也沒有更新,df命令就查看不到刪除文件后的磁盤情況。而du命令是對(duì)文件進(jìn)行統(tǒng)計(jì),文件在已經(jīng)在文件系統(tǒng)中刪除了,du命令自然查詢不到。

只能停止占用句柄的程序,才能更新超級(jí)塊的信息,類似的情況還有zookeeper的日志,直接使用重定向方式清空日志并不能釋放空間,df命令查看依然是占用的,只能重啟該節(jié)點(diǎn)的ZK。


模擬3.png

查看具體是哪個(gè)進(jìn)程占用了文件,然后將其kill掉,再次使用df查看,其結(jié)果與du一致。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容