1.前言
今早服務(wù)器有告警短信佛玄,提示主機(jī)磁盤空間已滿硼一,上機(jī)之后使用df命令查看磁盤確實滿了累澡,但當(dāng)我用du命令想查看具體是哪個文件夾過大的時候發(fā)現(xiàn)根本沒有,統(tǒng)計出來的文件都很小般贼,全家一起根本填不滿磁盤愧哟。
所以在網(wǎng)上查了一下奥吩,然后自己模擬一遍記個筆記。
2.命令原理
2.1 df命令
df命令使用的是statfs這個系統(tǒng)調(diào)用蕊梧,直接讀取分區(qū)的超級塊信息獲取分區(qū)使用情況霞赫。它的數(shù)據(jù)是基于分區(qū)元數(shù)據(jù)的,所以只能針對整個分區(qū)肥矢。由于df直接讀取超級塊端衰,所以運(yùn)行速度不受文件多少影響。
2.2 du命令
du命令會對待統(tǒng)計文件逐個調(diào)用fstat甘改,獲取文件大小旅东。它的數(shù)據(jù)是基于文件獲取的,所以有很大的靈活性十艾,不一定非要針對一個分區(qū)抵代,可以跨越多個分區(qū)操作。如果針對的目錄中文件很多忘嫉,du速度就會很慢了荤牍。
3.情況模擬
首先查看當(dāng)前磁盤情況,然后新建一個大小為1G的文件庆冕,模擬當(dāng)時的日志康吵。
可以看到現(xiàn)在df和du命令查看結(jié)果是一致的。
模擬一下有某個程序占用這個文件愧杯,然后再將文件刪除涎才,看看結(jié)果如何。
這次情況不一樣了力九,df顯示根目錄下已經(jīng)占用了19G耍铜,但du命令已經(jīng)看不到那個1G的文件了。
根本原因在于tail程序占用了1G.file這個文件句柄跌前,所以即便刪除了這個文件棕兼,超級塊信息也沒有更新,df命令就查看不到刪除文件后的磁盤情況抵乓。而du命令是對文件進(jìn)行統(tǒng)計奈辰,文件在已經(jīng)在文件系統(tǒng)中刪除了,du命令自然查詢不到司浪。
只能停止占用句柄的程序讹剔,才能更新超級塊的信息,類似的情況還有zookeeper的日志蜈出,直接使用重定向方式清空日志并不能釋放空間田弥,df命令查看依然是占用的,只能重啟該節(jié)點的ZK铡原。
查看具體是哪個進(jìn)程占用了文件偷厦,然后將其kill掉商叹,再次使用df查看,其結(jié)果與du一致只泼。