一次 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 等命令是發現不了這個文件的,剛好人為的疏忽加上隱藏的特性導致排查的困難
- 碎片的清理功能還是很有用的,在宿主機上清理一下有幾十的碎片被清理
