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