虛擬機克隆很慢的一種原因
故障現象
研發部採購了一臺新服務器,將老服務器上的虛擬機磁盤鏡像通過scp拷貝過來,然後用virt-clone的命令克隆虛擬機時,發現克隆速度非常慢,要十幾分鍾,在老服務器上克隆只需兩三分鐘。這個虛擬機磁盤鏡像的文件大小是120GB。
故障原因
經過排查後發現,新機器上的這個虛擬機鏡像的實際佔用空間是120GB,而老機器上的是5.5GB,新機器上克隆時每次都會調用qemu-img convert
對鏡像進行格式轉換,這個過程非常慢。
解決方法
使用qemu-img convert
把拷貝過來的鏡像作一次格式轉換,用轉換後的鏡像文件來替代它。命令如下:
# qemu-img convert -f qcow2 -O qcow2 /data/template.qcow2 /data/new-template.qcow2
# mv /data/new-template.qcow2 /data/template.qcow2
# virt-clone -o template -n new-host -f /data/new-host.qcow2
排查過程
查看磁盤IO
安裝sysstat這個rpm包,在克隆時運行iostat -d 2
命令,發現磁盤寫入速度很低。但是將一個ISO光盤鏡像文件複製到這個磁盤時,速度是150多MB每秒,說明磁盤IO沒問題。
查看CPU和內存使用率
在克隆時使用top命令,發現內存buff/cached非常多,qemu-img進程消耗了較多的CPU,通過ps -ef | grep qemu-img
可以看到進程詳情,通過進程的PPID查到這個進程是virt-clone
啓動的。
對比磁盤鏡像的信息
通過在新老機器上運行ls -lh /data/template.qcow2
和du -sh /data/template.qcow2
命令,發現在新老機器上du -sh
顯示的文件實際佔用空間分別是120GB和5.5GB,使用qemu-img info /data/template.qcow2
也可以查看鏡像實際使用的disk size。
原因分析
使用scp將鏡像文件拷貝過來時,將qcow2文件中的空洞空間也當作了實際內容寫入磁盤,導致磁盤文件實際大小變得非常大,在克隆時就非常慢。