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í)的日志。

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

這次情況不一樣了,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。

查看具體是哪個(gè)進(jìn)程占用了文件,然后將其kill掉,再次使用df查看,其結(jié)果與du一致。