Linux 離奇磁碟爆滿解決辦法

問題原因&通用解決步驟

頻繁收到es數據節點磁碟使用監控告警,到es上查看,磁碟使用率40%,因此登錄該告警伺服器,df -h 查看,如圖

image-20211210143757322

發下根目錄使用超過了80%,因此持續告警,按照以往辦法,直接du查看根目錄哪個目錄佔用最大,清理即可

根目錄超過了80%告警,其中data是數據盤,掛載在另外的文件系統上,不屬於根目錄所在文件系統。那麼直接使用du命令 du -h --max-depth=1 查看根目錄哪個目錄佔用磁碟空間最大就行了

image-20211210144003981

發下除了/data目錄,其它目錄屬於根目錄,加起來不過7G,那麼其它磁碟被什麼佔用了呢?

對於遇到df 和du結果不一致的情況,基本斷定是文件雖然刪除了,但是文件句柄仍然被持有,因此磁碟空間未釋放,可以使用lsof命令( list open files)查看
查看根目錄打開的文件,搜索刪除的文件 lsof -n / |grep deleted (這裡/是根目錄)

image-20211210144205791

懷疑是進程25550或25587持有刪除文件的句柄,分別查看進程是哪些應用

image-20211210144408437

分別是es應用和es中間件進程,大概原因是es應用進程25550持有刪除文件的句柄導致的,因此重啟此應用即可(kill也可以,但是可能會引起生產問題)。

原理解釋:

du命令會對待統計文件逐個調用fstat這個系統調用,獲取文件大小。它的數據是基於文件獲取的,所以有很大的靈活性,不一定非要針對一個分區,可以跨越多個分區操作。如果針對的目錄中文件很多,du速度就會很慢了。
df命令使用的事statfs這個系統調用,直接讀取分區的超級塊資訊獲取分區使用情況。它的數據是基於分區元數據的,所以只能針對整個分區。由於df直接讀取超級塊,所以運行速度不受文件多少影響。
du和df不一致情況
常見的df和du不一致情況就是文件刪除的問題。當一個文件被刪除後,在文件系統 目錄中已經不可見了,所以du就不會再統計它了。然而如果此時還有運行的進程持有這個已經被刪除了的文件的句柄,那麼這個文件就不會真正在磁碟中被刪除, 分區超級塊中的資訊也就不會更改。這樣df仍舊會統計這個被刪除了的文件。

如何記憶這3個命令
du ->Disk Usage
df ->Disk Free
lsof ->list open files

翻車記錄

重啟es後,發下磁碟佔用還是存在,沒辦法,先重啟了虛擬機,還是一樣,最後無奈只能先unmount數據盤/data試試

image-20211231225822744

然後du -h –max-depth=1

image-20211231225937054

原來根目錄/data有數據,然後掛載了數據盤後,把原/data的內容隱藏了。
解決辦法:先遷移/data/數據,然後清除/data數據,然後掛載磁碟到/data,最後啟動es