du 與df 統計系統磁盤不一致緣由與解決方法

事件原由:nginx

同事發現雲主機磁盤系統盤滿了,準備清理系統盤,便利用du 命令統計了根目錄下各文件夾的大小,發現統計的各文件夾的大小總和 加起來比 df 命令查看到的系統盤所使用空間 要小不少。這裏記錄下解決方法tomcat

瞭解下df與du的工做原理:spa

du日誌

du命令會對待統計文件逐個調用fstat這個系統調用,獲取文件大小。它的數據是基於文件獲取的,因此有很大的靈活性,不必定非要針對一個分區,能夠跨越多個分區操做。若是針對的目錄中文件不少,du速度就會很慢了。
 
df
df命令使用的事statfs這個系統調用,直接讀取分區的超級塊信息獲取分區使用狀況。它的數據是基於分區元數據的,因此只能針對整個分區。因爲df直接讀取超級塊,因此運行速度不受文件多少影響。
 
du和df不一致狀況緣由:
常見的df和du不一致狀況就是文件刪除的問題。當一個文件被刪除後,在文件系統目錄中已經不可見了,因此du就不會再統計它了。然而若是此時還有運行的進程持有這個已經被刪除了的文件的句柄,那麼這個文件就不會真正在磁盤中被刪除, 分區超級塊中的信息也就不會更改。這樣df仍舊會統計這個被刪除了的文件。
 
解決方法:
1 lsof | grep delete --- 查看已經刪除,仍被進程佔用沒有釋放空間的文件相關信息 2 獲得佔用文件的進程,重啓或kill該進程,釋放文件。 

進行第一步操做時發現有較大的tomcat 和 nginx的訪問日誌被刪除後但仍進程佔用,進行第二步操做後系統盤空間成功釋放不少,系統盤的使用率也就降下去了。code

 

其餘須要注意的:blog

(1)當出現du和df差距很大的狀況時,考慮是不是有刪除文件未完成形成的,方法是lsof命令,而後重啓或關閉相關進程便可。
(2)可使用清空文件的方式來代替刪除文件,方式是:echo "" > test.log。
(3)除了rm外,有些命令會間接的刪除文件,如gzip命令完成後會刪除原來的文件,爲了不在出現這種問題,前先確認沒有進程打開該文件。進程

相關文章
相關標籤/搜索