保护模式虚拟机使用qemu的snapshot参数引发的惨案

来源:互联网 发布:革委会 知乎 编辑:程序博客网 时间:2024/04/30 06:02

在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中获取数据。