快手二面,磁盤異常爆滿如何排查?
大家比較常見的情況應該是內(nèi)存或者 CPU 的告警,磁盤相對來說不那么容易出問題,畢竟大部分應用都不需要和磁盤交互,磁盤告警的示例如下:
圖片
一般遇到磁盤爆滿的告警,第一步要做的就是確認告警信息是否正確,登錄服務(wù)器,通過 df -Hl 查看:
圖片
可以看到 /dev/vda1 占據(jù)了 43G 的內(nèi)存,和告警信息一致,接著我們就是要找到導致磁盤空間滿的具體目錄或文件。
如何定位占用大量磁盤空間的目錄或文件?
一種基礎(chǔ)的做法是,在根目錄下執(zhí)行du -hs命令,列出各個目錄的大小。
圖片
為了進一步細化,可以進入具體的目錄重復該操作。這種方法雖然簡單,但不夠高效。
更優(yōu)的方法是使用du命令的-d參數(shù)(或--max-depth參數(shù)),設(shè)置目錄掃描的深度。掃描深度越大,輸出的結(jié)果會越多,此時可以通過grep過濾不必要的信息。
du -h -d 2 | grep [GT] | sort -nr
du -h --max-depth=2 | grep [GT] | sort -nr
這種方式可以快速篩選出以G或T為單位的大目錄,并按大小排序。
另一種更高效的方法是使用find命令:
find / -type f -size +1G -exec du -h {} \;
相較于du,find更加靈活和快速。通過這兩種方式,可以迅速定位占用磁盤空間的文件或目錄。
磁盤空間不一致的情況
然而,事情并不總是這么簡單。有時你可能會發(fā)現(xiàn),使用find或du查找到的文件占用空間與df命令顯示的磁盤使用量相差甚遠。比如上圖我們使用du -hs查看根目錄下所有文件的總和就只有10G左右,但 df顯示磁盤占用了37G,沒有隱藏目錄的情況下,剩余的空間去了哪里?
這種現(xiàn)象通常是由被刪除的文件占用空間但未釋放資源導致的。雖然文件被刪除了,但系統(tǒng)還沒有真正釋放其占用的空間。
此時,我們可以使用lsof命令來檢查是否有未完全釋放的文件:
lsof +L1
圖片
從上圖結(jié)果中可以看到,有一個被刪除但仍占用約28G空間的日志文件。這是比較常見的情況。解決方法是重啟相關(guān)應用(如Tomcat),以釋放這些被占用的空間。
磁盤空間被系統(tǒng)保留
有時候,你可能還會發(fā)現(xiàn)df命令顯示的Used和Available空間之和小于Total大小,似乎有部分空間"消失"了。
圖片
這實際上是Linux文件系統(tǒng)的安全機制。默認情況下,系統(tǒng)會為root用戶預留5%的磁盤空間,用于緊急情況。這樣可以確保關(guān)鍵應用(如數(shù)據(jù)庫)在磁盤滿時仍有少量空間,避免崩潰。
如果需要釋放這部分保留空間,可以使用tune2fs命令調(diào)整預留空間的比例:
tune2fs -m 1 /dev/vda1
上述命令執(zhí)行后將只保留 1G 的安全空間: