為什么阿里云ECS Linux 實(shí)例執(zhí)行 df 和 du 查看磁盤時(shí)結(jié)果不一致
問題現(xiàn)象
-
執(zhí)行 df -h 查看 ECS Linux 實(shí)例文件系統(tǒng)使用率,可以看到 /dev/xvdb1 磁盤占用了約27G,掛載目錄為 /opt 。
-
進(jìn)入到 /opt 目錄執(zhí)行 du -sh ,顯示空間總占用量約 2.4 G,即df 和du查看到的結(jié)果不一致。
?原因分析
-
du 命令對統(tǒng)計(jì)文件逐個(gè)進(jìn)行 fstat 系統(tǒng)調(diào)用,獲取文件大小。它的數(shù)據(jù)是基于文件獲取,可以跨多個(gè)分區(qū)操作。
-
df 命令使用 statfs 系統(tǒng)調(diào)用,直接讀取分區(qū)的超級塊信息獲取分區(qū)使用情況。它的數(shù)據(jù)基于分區(qū)元數(shù)據(jù),只能針對整個(gè)分區(qū)。
-
用戶刪除了大量的文件后,du 就不會在文件系統(tǒng)目錄中統(tǒng)計(jì)這些文件。如果此時(shí)還有運(yùn)行中的進(jìn)程持有這個(gè)已經(jīng)被刪除的文件句柄,那么這個(gè)文件就不會真正在磁盤中被刪除,分區(qū)超級塊中的信息也就不會更改,df 仍會統(tǒng)計(jì)這個(gè)被刪除的文件。
-
通過 lsof 查詢處于 deleted 狀態(tài)的文件,被刪除的文件在系統(tǒng)中被標(biāo)記為 deleted 。如果系統(tǒng)有大量 deleted 狀態(tài)的文件,會導(dǎo)致 du 和 df 統(tǒng)計(jì)結(jié)果不一致。 #lsof |grep deleted //在opt目錄下執(zhí)行l(wèi)sof |grep deleted
?解決方案
-
根據(jù) lsof 列出的 pid,kill 相應(yīng)進(jìn)程或者重啟相應(yīng)的服務(wù),如:#kill -9 692。
注意:如果 ECS 實(shí)例正在運(yùn)行業(yè)務(wù)進(jìn)程,kill 會直接終止進(jìn)程,請慎重操作。
-
重啟實(shí)例。重啟實(shí)例系統(tǒng)會退出現(xiàn)有的進(jìn)程,開機(jī)后重新加載,過程中會釋放調(diào)用的 deleted 文件的句柄。
如問題還未解決,請提交工單聯(lián)系阿里云。