前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >openstack nova hotplug

openstack nova hotplug

作者头像
惠伟
发布2021-02-24 11:26:12
1.3K0
发布2021-02-24 11:26:12
举报
文章被收录于专栏:虚拟化笔记虚拟化笔记

本想写三篇,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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • qemu
  • libvirt
  • libvirt-python
  • openstack
  • 总结
  • 代码实现
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档