Zabbix 告警 /home 使用率超過 90%,發現 MongoDB 資料檔佔用大量空間。刪除 MongoDB 資料檔後,df -h 顯示空間未釋放,甚至使用率上升至 96%,但 du -sh /home 顯示實際使用量很低。
Linux 中,刪除檔案 (unlink) 僅移除目錄項目,若有進程仍持有該檔案的開啟描述符,資料塊不會真正釋放。空間會在進程關閉檔案或結束後才歸還給檔案系統。
lsof 找出已刪除但仍被持有的檔案:lsof | grep deleted
輸出範例:
mongod 1234 mongodb 4u REG 253,0 1073741824 12 /home/mongodb/data.0 (deleted)
systemctl restart mongod
# 或
service mongod restart
df -h,空間已恢復正常。若服務不可重啟,可透過 /proc 檔案系統強制關閉檔案描述符 (謹慎操作):
# 找到檔案描述符編號 (如上例為 4)
ls -l /proc/1234/fd/ | grep deleted
# 強制關閉 (需 root,極度危險,可能導致進程崩潰)
# echo > /proc/1234/fd/4 # 不推薦生產環境使用
lsof | grep deleted 定期檢查fuser filename)logrotate 管理日誌輪轉,避免手動刪除導致描述符殘留| 指令 | 統計範圍 | 受「已刪除但開啟」檔案影響 |
|---|---|---|
df | 檔案系統區塊使用量 | ✅ 是 (空間未釋放) |
du | 目錄樹下實際檔案大小 | ❌ 否 (已從目錄移除) |
lsof | 進程開啟的檔案描述符 | ✅ 可見 (標記 deleted) |