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