Linux 離奇磁碟爆滿解決辦法
問題原因&通用解決步驟
頻繁收到es數據節點磁碟使用監控告警,到es上查看,磁碟使用率40%,因此登錄該告警伺服器,df -h
查看,如圖
發下根目錄使用超過了80%,因此持續告警,按照以往辦法,直接du查看根目錄哪個目錄佔用最大,清理即可
根目錄超過了80%告警,其中data是數據盤,掛載在另外的文件系統上,不屬於根目錄所在文件系統。那麼直接使用du命令 du -h --max-depth=1
查看根目錄哪個目錄佔用磁碟空間最大就行了
發下除了/data目錄,其它目錄屬於根目錄,加起來不過7G,那麼其它磁碟被什麼佔用了呢?
對於遇到df 和du結果不一致的情況,基本斷定是文件雖然刪除了,但是文件句柄仍然被持有,因此磁碟空間未釋放,可以使用lsof命令( list open files)查看
查看根目錄打開的文件,搜索刪除的文件 lsof -n / |grep deleted (這裡/是根目錄)
懷疑是進程25550或25587持有刪除文件的句柄,分別查看進程是哪些應用
分別是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試試
然後du -h –max-depth=1
原來根目錄/data有數據,然後掛載了數據盤後,把原/data的內容隱藏了。
解決辦法:先遷移/data/數據,然後清除/data數據,然後掛載磁碟到/data,最後啟動es