df和du顯示的磁盤空間使用狀況不一致問題

背景介紹:
dba同事刪除了mysql /datao目錄下的文件,經過du –sh查看空間使用700G,df -h查看空間使用1T,沒有重啓mysql服務。mysql

另外一個表現出du與df命令不一樣之處的例子以下:
若是用戶刪除了一個正在運行的應用所打開的某個目錄下的文件,則du命令返回的值顯示出減去了該文件後的目錄的大小。但df命令並不顯示減去該文件後的大小。直到該運行的應用關閉了這個打開的文件,df返回的值才顯示出減去了該文件後的文件系統的使用狀況。sql

du的工做原理:
du命令會對待統計文件逐個調用fstat這個系統調用,獲取文件大小。它的數據是基於文件獲取的,因此有很大的靈活性,不必定非要針對一個分區,能夠跨越多個分區操做。若是針對的目錄中文件不少,du速度就會很慢了。
df的工做原理:
df命令使用的事statfs這個系統調用,直接讀取分區的超級塊信息獲取分區使用狀況。它的數據是基於分區元數據的,因此只能針對整個分區。因爲df直接讀取超級塊,因此運行速度不受文件多少影響。日誌

文件系統分配其中的一些磁盤塊用來記錄它自身的一些數據,如i節點,磁盤分佈圖,間接塊,超級塊等。這些數據對大多數用戶級的程序來講是不可見的,一般稱爲Meta Data。
du命令是用戶級的程序,它不考慮Meta Data,而df命令則查看文件系統的磁盤分配圖並考慮Meta Data。df命令得到真正的文件系統數據,而du命令只查看文件系統的部分狀況。進程

工做中須要注意的地方:
1.當出現du和df差距很大的狀況時,考慮是不是有刪除文件未完成形成的,方法是lsof |grep delete命令,而後中止相關進程便可。
2.可使用清空文件的方式來代替刪除文件,方式是:echo > myfile.iso。
3.對於常常發生刪除問題的日誌文件,以更名、清空、刪除的順序操做。
4.除了rm外,有些命令會間接的刪除文件,如gzip命令完成後會刪除原來的文件,爲了不刪除問題,壓縮前先確認沒有進程打開該文件。ip

相關文章
相關標籤/搜索