天天看點

保護模式虛拟機使用qemu的snapshot參數引發的慘案

在ovirt環境中,有1個手動池,使用者每次使用完後,需要将虛拟機回退到原始版本。

在ovirt原有的實作裡,是通過快照來實作的,他所謂的快照,其實就是建立原磁盤的一個增量檔案,虛拟機運作時,原來的磁盤作為模闆,資料寫入到增量檔案中,虛拟機關閉時隻要把增量檔案删除了就行,不會影響到原磁盤。

這種社群的方式在生産環境中也出現了一些小問題,于是我們引入了qemu自帶的snapshot參數,這樣qemu讀寫磁盤時會寫在臨時檔案或者記憶體中,我們樂的什麼也不用管,而且很穩定。

但是,後來發現了這種方式在塊裝置+qcow自動擴容時存在大問題。

為什麼需要擴容

      為了節省容量,自動池的虛拟機都是基于模闆生成增量檔案,這個虛拟機磁盤本身是1個增量,如果用lvm塊裝置來建立的話,剛建立的時候會使用很少的容量,ovirt在主機端的vdsm程序會監控這個磁盤的實體容量和使用量,必要的時候自動擴容。

擴容時産生的問題:

1,qemu使用snapshot參數是,不會再寫原磁盤,會建立1個臨時磁盤,這個磁盤的容量從0開始增長,寫多少增長多少。

2,Libvirt讀取虛拟機磁盤資訊時,讀到的是臨時磁盤的容量,而且每次讀到的磁盤容量和使用量相等,于是向spm主機發起擴容需求。

3,spm主機收到擴容請求,對原磁盤進行擴容,擴容的大小總是4G+目前使用量,目前容量總是1M,2M,3M這樣臨時磁盤的容量,是以每次擴容時總是4096,4097,4098,4099,使得原lvm磁盤的容量按M逐漸擴充。

影響:

1,擴容與spm主機通信,需要通過寫入存儲,加重存儲讀寫壓力。

2,主機上虛拟機多時,過多的擴容指令,會占滿主機與spm主機的通信隊列(預設64個),會使得兩者通信異常,嚴重時造成主機狀态異常。

3,lvm磁盤碎片嚴重,會使得存儲性能降低。

修改辦法:

1,擴容時,将目前大小格式化為整G,按G擴容。

2,擴容時,spm傳回了原磁盤的目前實體容量,使用傳回的容量,而不是Libvirt擷取的磁盤容量,依據此來判斷是否需要擴容。

ovirt後續版本對于不同情況的擴容有類似修正,不再隻從libvirt中擷取資料。