1. 程式人生 > >一次 KVM 虛擬機器磁碟佔滿的排查過程

一次 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. 碎片的清理功能還是很有用的,在宿主機上清理一下有幾十的碎片