07.14 講述下Linux 執行 df 和 du 查看磁盤時佔用結果不一致的解決辦法

問題現象

1、執行 df -h 查看 ECS Linux 實例文件系統使用率,可以看到 /dev/xvdb1 磁盤佔用了約27G,掛載目錄為 /opt 。

講述下Linux 執行 df 和 du 查看磁盤時佔用結果不一致的解決辦法

2、進入到 /opt 目錄執行 du -sh ,顯示空間總佔用量約 2.4 G,即df 和du查看到的結果不一致。

講述下Linux 執行 df 和 du 查看磁盤時佔用結果不一致的解決辦法

原因分析

du 命令對統計文件逐個進行 fstat 系統調用,獲取文件大小。它的數據是基於文件獲取,可以跨多個分區操作。

df 命令使用 statfs 系統調用,直接讀取分區的超級塊信息獲取分區使用情況。它的數據基於分區元數據,只能針對整個分區。

用戶刪除了大量的文件後,du 就不會在文件系統目錄中統計這些文件。如果此時還有運行中的進程持有這個已經被刪除的文件句柄,那麼這個文件就不會真正在磁盤中被刪除,分區超級塊中的信息也就不會更改,df 仍會統計這個被刪除的文件。

通過 lsof 查詢處於 deleted 狀態的文件,被刪除的文件在系統中被標記為 deleted 。如果系統有大量 deleted 狀態的文件,會導致 du 和 df 統計結果不一致。

#lsof |grep deleted //在opt目錄下執行lsof |grep deleted

解決方案

1、根據 lsof 列出的 pid,kill 相應進程或者重啟相應的服務,如:#kill -9 692。

2、重啟服務器。重啟服務器系統會退出現有的進程,開機後重新加載,過程中會釋放調用的 deleted 文件的句柄。


分享到:


相關文章: