openstack nova hotplug

2021-02-24 11:26:12 浏览数 (1)

本想写三篇,openstack nova hotplug,qemu和kvm hotplug,还有linux hotplug,现在看来有难度,光一个openstack nova hotplug就花费了很长时间,而且还遗留了一大堆问题,要把一个功能搞好真的是太难了,剩下两篇原理和代码要搞清楚也很难,希望自己能完成吧,好多技术一想全是问题,再一看代码都不懂,疑问越来越多,战绩越来越长。

虚拟机能支持在线热扩容是一个很好的功能,这样能达到理细粒度的资源控制,随便加cpu和去cpu对用户来说更能节省费用,但云平台实现和计费就有难度了。

调研的结果是底层支持虚拟机热升级cpu/memory/volume/interface,openstack得开发cpu和momery hotplug的代码,qemu 2.6.0支持cpu和memory hotplug,libvirt 3.9.0 virsh attach-device直接调用qemu添加memory/interface/block,但需要改变qemu启动的参数,目前openstack启动的虚拟机参数是-smp 4 -m 2048,没有slots,maxmem和maxcpus,openstack没有cpu和momory hotplug的api。

qemu

-m [size=]megs[,slots=n,maxmem=size]

Where,

- "megs" is the startup RAM. It is the RAM the guest will boot with - "slots" is the number of hotpluggable memory slots - "maxmem" is the maximum RAM size the guest can have

Two monitor commands are used to hotplug memory:

- "object_add": creates a memory backend object - "device_add": creates a front-end pc-dimm device and inserts it into the first empty slot

For example, the following commands add another 1GB to the guest discussed earlier:

(qemu) object_add memory-backend-ram,id=mem1,size=1G (qemu) device_add pc-dimm,id=dimm1,memdev=mem1

-smp 1,maxcpus=4 qemu-monitor执行cpu-add,也可以用device_add driver=host-x86_64-cpu,socket-id=1,core-id=0,thread-id=0,id=cpu0

libvirt

<maxMemory slots='16' unit='KiB'>33554432</maxMemory> //hw_mem_max设置到这儿,slots直接默认16 <memory unit='KiB'>16777216</memory> <currentMemory unit='KiB'>16777216</currentMemory> <vcpu placement='static' current='8'>16</vcpu> //flavor中vcpu设置到current中,hw_vcpu_max替换原来的vcpu个数

<numatune> <memory mode='strict' nodeset='0'/> <memnode cellid='0' mode='strict' nodeset='0'/> </numatune>

<cpu mode='host-passthrough' check='none'> <topology sockets='1' cores='16' threads='1'/> //hw_vcpu_max替换这儿的总数 <numa> <cell id='0' cpus='0-7' memory='16777216' unit='KiB'/> //替换成cell max </numa> </cpu>

<memory model='dimm'> <target> <size unit='KiB'>1048576</size> <node>0</node> </target> <alias name='dimm0'/> <address type='dimm' slot='0'/> </memory>

virsh attach-device instance-00001eb5 <xml filename> --config --live

virsh setvcpu instance-00001eb5 <vcpu number> --enable

vcpu为什么不能用attach-device?

libvirt-python

setVcpus和setVcpusFlags可以hotplug vcpu,setMemory和setMemoryFlags和memory ballooning有关,不能实现dimm hotplug

import libvirt conn = libvirt.open() vm = conn.lookupByName("instance-00001eb5") xml = "<memory model='dimm'><target><size unit='MiB'>1024</size><node>0</node></target>></memory>" vm.attachDeviceFlags(xml, libvirt.VIR_DOMAIN_AFFECT_LIVE|libvirt.VIR_DOMAIN_AFFECT_CONFIG)

实现class LibvirtConfigGuestMemoryDeviceDIMM生成xml

libvirt 3.9.0和qemu 2.6.0 hotplug memory第二次报错libvirt.libvirtError: internal error: unable to execute QEMU command 'device_add': Duplicate ID 'dimm1' for device

libvirt 4.5.0和qemu 2.12.0没问题

openstack

第一步实现后台手动cpu和memory hotplug,只考虑guest是一个numa节点,不考虑大页面内存等特殊情况。

目前image已经有元数据hw_numa_nodes,memory hotplug需要至少一个numa node,还需要实现hw_vcpu_max和hw_mem_max。

[root@compute1 nova]# virsh start instance-0000002c error: Failed to start domain instance-0000002c error: unsupported configuration: At least one numa node has to be configured when enabling memory hotplug

-numa node,nodeid=0,cpus=0-7,memdev=ram-node0 -m size=16777216k,slots=16,maxmem=33554432k -smp 8,maxcpus=16,sockets=1,cores=16,threads=1

第二步实现api接口 cpu hotplug和memory hotplug

nova-compute实现hotplug时要考虑资源问题,本机上cpu或者memory不够是否需要reschedule,还有quota等。

本机上不够报错,不迁移,虚拟机不可能hotplug到无限大,不可能超过最大的物理机。

hotplug后影响所有其它流程如rebuild,shutdown,start和migration,这些流程操作后要能保存hotplug的结果,

rebuild,shutdown,hard reboot这些需要重启虚拟机的,直接用最后的flavor替换原来的flavor。

live-migration目的主机必须构造兼容源虚拟机的特殊libvirt xml和qemu参数,否则live-migration会失败

device_add driver=qemu64-x86_64-cpu socket-id=1 core-id=0 thread-id=0 id=cpu2 -device qemu64-x86_64-cpu,socket-id=1,core-id=0,thread-id=0,id=cpu2,hotplugged=on

总结

虚拟机设置numa_node=1时只能调度到物理机上的一个numa节点上,此时这个numa到底能不能考虑超卖?

nova interface-attach有没有记录数据库?pci编号在热迁移时怎么处理的?

cpu和memory分为两个api还是一个?—利用resize api接口参数,给一个flavor id。

current中指定的目前激活的vcpu在numa节点上怎么分配?memory也一样?

目前hw:numa_cpus.0=0,1和hw:numa_mem.0=2048可以指定目前cpu和memory在numa上的分配,增加numa_max_cpus和numa_max_mem指定hotplug最大时cpu和memory在numa上的分配。

如果guest是多numa结构的,memory hotplug到哪个numa节点?需要api接口指定?

利用flavor元数据指定,一个numa用flavor中的vcpu和memory,多numa用flavor中的hw:numa_cpus.0=0,1和hw:numa_mem.0=2048减去原来的。

socket是怎么映射到numa cell上的?

cpu hotplug到guest中的那个socket?哪个core?

python-libvirt接口不支持,只能设置一个激活的总数,需要修改支持numa,不支持core,哪个core哪个thread让libvirt和qemu决定。

libvirt attach-device为什么不支持attach cpu?

代码实现

目前只实现了nova libvirt driver。

huiweics/nova​github.com

参考文献

https://github.com/qemu/qemu/blob/master/docs/memory-hotplug.txt

https://wiki.qemu.org/Features/CPUHotplug

https://libvirt.org/formatdomain.html

0 人点赞