du 與df 統計系統磁碟不一致原因與解決方法

2022-03-30 10:26:42 字數 1053 閱讀 5334

事件起因:

同事發現雲主機磁碟系統盤滿了,準備清理系統盤,便利用du 命令統計了根目錄下各資料夾的大小,發現統計的各資料夾的大小總和 加起來比 df 命令檢視到的系統盤所使用空間 要小很多。這裡記錄下解決方法

了解下df與du的工作原理:

dudu命令會對待統計檔案逐個呼叫fstat這個系統呼叫,獲取檔案大小。它的資料是基於檔案獲取的,所以有很大的靈活性,不一定非要針對乙個分割槽,可以跨越多個分割槽操作。如果針對的目錄中檔案很多,du速度就會很慢了。

dfdf命令使用的事statfs這個系統呼叫,直接讀取分割槽的超級塊資訊獲取分割槽使用情況。它的資料是基於分割槽元資料的,所以只能針對整個分割槽。由於df直接讀取超級塊,所以執行速度不受檔案多少影響。

du和df不一致情況原因:

常見的df和du不一致情況就是檔案刪除的問題。當乙個檔案被刪除後,在檔案系統目錄中已經不可見了,所以du就不會再統計它了。然而如果此時還有執行的程序持有這個已經被刪除了的檔案的控制代碼,那麼這個檔案就不會真正在磁碟中被刪除, 分割槽超級塊中的資訊也就不會更改。這樣df仍舊會統計這個被刪除了的檔案。

解決方法:

1 lsof | grep delete                   --- 檢視已經刪除,仍被程序占用沒有釋放空間的檔案相關資訊

2 得到占用檔案的程序,重啟或kill該程序,釋放檔案。

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

其他需要注意的:

(1)當出現du和df差距很大的情況時,考慮是否是有刪除檔案未完成造成的,方法是lsof命令,然後重啟或關閉相關程序即可。

(2)可以使用清空檔案的方式來代替刪除檔案,方式是:echo "" > test.log。

(3)除了rm外,有些命令會間接的刪除檔案,如gzip命令完成後會刪除原來的檔案,為了避免在出現這種問題,前先確認沒有程序開啟該檔案。

df和du磁碟空間不一致

最近在伺服器上部署了一套服務,服務執行過程中不小心把日誌檔案給刪除了,測試了一下沒有影響服務的正常執行,而且沒有日誌後處理的操作就不以為意的扔那了,但不經意間也埋下了乙個巨大的坑。收到伺服器磁碟報警的時候就df看了一下滿了,但是du h看的時候發現才總共130g的磁碟採用了20g不到。df h 磁碟...

df和du顯示空間不一致,最新解決方案來了

下面的方法我基本可以保證,如果df和du顯示空間不一致,除了普遍的解決方法外,網路上你根本搜尋不到!除非你是linux高手!高手在此我們膜拜!在分析df和du查到的結果不一樣之前,我們先來了解下linux的df和du命令有什麼不同。這個大家可以從網上很直觀的搜尋到,一艘一大片,我們在這裡還是要囉嗦一...

docker 系統時區與jvm時區不一致

linux centos 7.5 docker 18.06 最近做了乙個功能,要求資料庫中的時間和系統時間存在很小誤差才能使用,部署上伺服器時出現了很大時差,計算下來剛好8個小時,然後去看log發現log4j打出來的時間不是東八區。修改系統時區,執行 cp usr share zoneinfo as...