一次 KVM 虛擬機磁盤佔滿的排查過程

一次 KVM 虛擬機磁盤佔滿的排查過程

KVM 虛擬機系統為 CentOS,文件系統為 XFS。

現象如下:

  1. 使用 df -h 命令發現磁盤剩餘空間為30k(總大小為30G),使用 df -i 發現 inode 可用數量為 800(總數為18w,正常狀態為1000w+)
  2. 虛擬機為初始狀態時,磁盤空間使用都正常

排查如下:

  1. 查看了幾個日誌,大小都在10M以下,並且這些日誌幾乎一一對應,不存在某個日誌比其它多幾個數量的問題,又因為是遠程客戶,於是漏了個文件,干
  2. 使用 du 命令(記住這個命令)排查具體是哪個目錄佔用的磁盤空間較多,du -h --max-depth=1 / 的結果顯示磁盤空間只佔用了 25% 左右,另尋它法
  3. 在網上搜索有磁盤文件刪除未釋放的說法,使用命令 lsof | grep deleted 找到未釋放的文件小的可憐只有 10M 左右,這個不成立
  4. 既然磁盤看不出有啥問題,那就從 inode 數量看看,看看哪個目錄下打開的文件數量較多 find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n -r | head -n 20 最多的目錄還是 man 下的,最多5000,最多的20個目錄下的數量相加不足50%,這個也不成立
  5. 從文件系統的角度看看,是不是碎片太多了需要回收一些這個碎片,找到磁盤號 df -aT | grep -w xfs,如果我的文件系統是 /dev/vda3, 那麼通過xfs文件系統的命令 xfs_db -c frag -r /dev/vda3 看到只有 1.7% 的碎片,清理碎片 xfs_fsr /dev/vda3, 然而並沒啥用處,再次查看只減少了 0.1% 的碎片
  6. 檢測是否有壞道,badblocks -vs -b 4096 -c 32 /dev/vda3 發現都正常
  7. 裂開了,找不到解決方案,於是向紅帽發了封郵件(未回)

因為一下拿不出解決方案,只能硬着頭皮把這個虛擬機從客戶那搞回來,恢復現場,有了進展

  1. 解壓完後這個鏡像文件有 30G,沒多想,就是覺得有的大
  2. 嘗試對這個鏡像文件進行磁盤擴容,qemu-img resize , 在這之前實驗了一下一個臨時的虛擬機,其中一個命令 qemu-img info 發現兩個虛擬機的 virtual size 都是30G,但是顯示臨時虛擬機的disk size 只有6G,而那個有問題的虛擬機 disk size 剛好是 30G,目前這個虛擬機還沒有啟動,肯定是裏面真的佔用了這麼多磁盤
  3. 於是準備把裏面的日誌文件拿出來在 vscode 中看一下,然後使用 virt-copy-out 一個文件時發現有一步巨慢,好了後看了一下這個文件 20G+,du的結果加上這個文件大小剛好就是總的大小,磁盤的問題就解決了,至於為什麼這麼大那是業務的東西了

由於和業務相關,所以寫的還是有點模糊,這裡解釋一下

  1. xfs 文件系統的 inode 總數是會變的,在剩餘磁盤空間不足5%時,開始減少
  2. 最最最重要的一個點,那個忽略的文件是被隱藏的(掛載內核),ls du 等命令是發現不了這個文件的,剛好人為的疏忽加上隱藏的特性導致排查的困難
  3. 碎片的清理功能還是很有用的,在宿主機上清理一下有幾十的碎片被清理