一次 KVM 虛擬機磁盤佔滿的排查過程
一次 KVM 虛擬機磁盤佔滿的排查過程
KVM 虛擬機系統為 CentOS,文件系統為 XFS。
現象如下:
- 使用
df -h
命令發現磁盤剩餘空間為30k(總大小為30G),使用df -i
發現 inode 可用數量為 800(總數為18w,正常狀態為1000w+) - 虛擬機為初始狀態時,磁盤空間使用都正常
排查如下:
- 查看了幾個日誌,大小都在10M以下,並且這些日誌幾乎一一對應,不存在某個日誌比其它多幾個數量的問題,又因為是遠程客戶,於是漏了個文件,干
- 使用 du 命令(記住這個命令)排查具體是哪個目錄佔用的磁盤空間較多,
du -h --max-depth=1 /
的結果顯示磁盤空間只佔用了 25% 左右,另尋它法 - 在網上搜索有磁盤文件刪除未釋放的說法,使用命令
lsof | grep deleted
找到未釋放的文件小的可憐只有 10M 左右,這個不成立 - 既然磁盤看不出有啥問題,那就從 inode 數量看看,看看哪個目錄下打開的文件數量較多
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n -r | head -n 20
最多的目錄還是 man 下的,最多5000,最多的20個目錄下的數量相加不足50%,這個也不成立 - 從文件系統的角度看看,是不是碎片太多了需要回收一些這個碎片,找到磁盤號
df -aT | grep -w xfs
,如果我的文件系統是 /dev/vda3, 那麼通過xfs文件系統的命令xfs_db -c frag -r /dev/vda3
看到只有 1.7% 的碎片,清理碎片xfs_fsr /dev/vda3
, 然而並沒啥用處,再次查看只減少了 0.1% 的碎片 - 檢測是否有壞道,
badblocks -vs -b 4096 -c 32 /dev/vda3
發現都正常 - 裂開了,找不到解決方案,於是向紅帽發了封郵件(未回)
因為一下拿不出解決方案,只能硬着頭皮把這個虛擬機從客戶那搞回來,恢復現場,有了進展
- 解壓完後這個鏡像文件有 30G,沒多想,就是覺得有的大
- 嘗試對這個鏡像文件進行磁盤擴容,
qemu-img resize
, 在這之前實驗了一下一個臨時的虛擬機,其中一個命令qemu-img info
發現兩個虛擬機的virtual size
都是30G,但是顯示臨時虛擬機的disk size
只有6G,而那個有問題的虛擬機disk size
剛好是 30G,目前這個虛擬機還沒有啟動,肯定是裏面真的佔用了這麼多磁盤 - 於是準備把裏面的日誌文件拿出來在 vscode 中看一下,然後使用
virt-copy-out
一個文件時發現有一步巨慢,好了後看了一下這個文件 20G+,du的結果加上這個文件大小剛好就是總的大小,磁盤的問題就解決了,至於為什麼這麼大那是業務的東西了
由於和業務相關,所以寫的還是有點模糊,這裡解釋一下
- xfs 文件系統的 inode 總數是會變的,在剩餘磁盤空間不足5%時,開始減少
- 最最最重要的一個點,那個忽略的文件是被隱藏的(掛載內核),ls du 等命令是發現不了這個文件的,剛好人為的疏忽加上隱藏的特性導致排查的困難
- 碎片的清理功能還是很有用的,在宿主機上清理一下有幾十的碎片被清理