OpenStack nova动态添加/删除cpu内存的简单实现

环境

版本: rdo OpenStack Liberty

qemu: 2.3.0

libvirt: 1.2.17-13

思路

需要qemu-guest-agent支持,在镜像中安装qemu-guest-agent包,并设置开机自启动,然后镜像设置元数据:

这两种方式设置都可以:

glance image-update <image-id> --property hw_qemu_guest_agent=yes
nova image-meta {image_id} set hw_qemu_guest_agent=yes

然后生成的虚拟机libvirt xml文件会如下信息:

<channel type=‘unix‘>
   <source mode=‘bind‘ path=‘/var/lib/libvirt/qemu/org.qemu.guest_agent.0.instance-00000011.sock‘/>
      <target type=‘virtio‘ name=‘org.qemu.guest_agent.0‘/>
   <address type=‘virtio-serial‘ controller=‘0‘ bus=‘0‘ port=‘1‘/>
</channel>

1、热添加cpu功能:libvirt接口支持,通过配置nova flavor的元数据cpu:max来预分配vcpu;最终调用libvirt的setVcpusFlags函数来实现(需要注意的是:硬重启虚拟机,libvirt xml文件会根据数据库表的信息重新生成,这块已处理好)

2、热移除cpu功能:移除vcpu后,虚拟机需要重启生效(这里可以在api那端设置限制,关机状态下才可以进行移除vcpu操作)

3、热添加、热减少内存: 这个好像没什么问题, 设置最大内存的时候,libvirt那边不能是active的domain

这是本人的简单实现:https://github.com/yaoice/nova/commit/26e9e3840abc0f8c81342b58c14c5af0e397c063

测试

TOKEN=`openstack token issue | awk ‘/id/ {print $4}‘ | head -1`
export TOKEN=${TOKEN}
export SERVER=`nova list | awk ‘/ACTIVE/ {print $2}‘`

显示虚拟机vcpu个数

curl -i "http://node_172_16_214_226:8774/v2.1/7d58dea58dd448d4b095da27986176f2/servers/${SERVER}/os-server-cpu-hotplug"         -X GET         -H "User-Agent: python-novaclient"         -H "Content-Type: application/json"         -H "Accept: application/json"         -H "X-Auth-Token: ${TOKEN}"

设置虚拟机vcpu

curl -g -i -X POST http://node_172_16_214_226:8774/v2.1/7d58dea58dd448d4b095da27986176f2/servers/${SERVER}/action         -H "User-Agent: python-novaclient"         -H "Content-Type: application/json"         -H "Accept: application/json"         -H "X-OpenStack-Nova-API-Version: 2.5"         -H "X-Auth-Token: ${TOKEN}"         -d ‘{"setVcpus": {"vcpus": 6}}‘

设置成功的虚拟机的libvirt xml有如下信息:

libvirt vcpu xml: <vcpu placement=‘static‘ current=‘4‘>16</vcpu>

显示虚拟机的内存

curl -i "http://node_172_16_214_226:8774/v2.1/7d58dea58dd448d4b095da27986176f2/servers/${SERVER}/os-server-mem-hottune"         -X GET         -H "User-Agent: python-novaclient"         -H "Content-Type: application/json"         -H "Accept: application/json"         -H "X-Auth-Token: ${TOKEN}"

设置虚拟机的内存

curl -g -i -X POST http://node_172_16_214_226:8774/v2.1/7d58dea58dd448d4b095da27986176f2/servers/${SERVER}/action         -H "User-Agent: python-novaclient"         -H "Content-Type: application/json"         -H "Accept: application/json"         -H "X-OpenStack-Nova-API-Version: 2.5"         -H "X-Auth-Token: ${TOKEN}"         -d ‘{"setMem": {"mem": 4096}}‘

常见报错

virsh # setvcpus --live --guest instance-00000040 3
error: invalid argument: requested vcpu count is greater than the count of enabled vcpus in the domain: 3 > 2

virsh # setmaxmem --live 11 7292608
error: Unable to change MaxMemorySize
error: Requested operation is not valid: cannot resize the maximum memory on an active domain

参考链接

(how to add nova api method) https://github.com/accelazh/example-nova-exensions/blob/master/nova/nova/api/openstack/compute/contrib/example_resource.py

(how to configure qemu-guest-agent) https://www.sebastien-han.fr/blog/2015/02/09/openstack-perform-consistent-snapshots-with-qemu-guest-agent/

(flavor extra_specs usage) http://docs.openstack.org/admin-guide/compute-flavors.html

(KVM主机动态更改cpu数量和内存大小) http://bbotte.blog.51cto.com/6205307/1635733

(libvirt cpu hot remove 需要重启cpu数量才会真正减少) http://www.unixarena.com/2015/12/linux-kvm-how-to-add-remove-vcpu-to-guest-on-fly.html

时间: 2024-10-10 13:57:07

OpenStack nova动态添加/删除cpu内存的简单实现的相关文章

jquery动态添加删除一行数据

<html> <head> <title>添加.删除一行</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript" src="../js/jquery-1.9.1.js"></script>

Hadoop动态添加/删除节点(datanode和tacktracker)

总的来说,正确的做法是优先通过配置文件,再在具体机器上进行相应进程的启动/停止操作. 网上一些资料说在调整配置文件的时候,优先使用主机名而不是IP进行配置. 总的来说添加/删除DataNode和TaskTracker的方法非常相似,只是操作的配置项和使用的命令有微小差异. 1. DataNode 1.0 配置文件 在master/namenode下修改配置文件conf/mapred-site.xml. 关键参数dfs.hosts和dfs.hosts.exclude. 注意:不同hadoop版本的

js实现网页收藏功能,动态添加删除网址

<html> <head> <title> 动态添加删除网址 </title> <meta charset="utf-8"> <script> function add(){ var name = document.getElementById("name").value; var url = document.getElementById("url").value; var

编辑 Ext 表格(一)——— 动态添加删除行列

一.动态增删行 在 ext 表格中,动态添加行主要和表格绑定的 store 有关, 通过对 store 数据集进行添加或删除,就能实现表格行的动态添加删除. (1) 动态添加表格的行  gridStore.add({}); (2) 动态删除表格的行 gridStore.removeAt(gridStore.count() - 1); 二.动态增删列 在 ext 表格中,动态添加列主要通过修改表格绑定的 column 元素, 通过对 column 元素集进行添加或删除,然后重新渲染表格,就能实现表

安卓动态添加删除多个控件

新手上路,没找到动态添加删除多个控件,捣鼓了个,做错的地方麻烦大家说下 activity_main.xml: <Button        android:id="@+id/add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="myclick" 

Jquery 动态添加删除元素 用js添加的元素无法删除问题

用jquery方法的绑定侦听和销毁来解决动态div的增加删除: 正确代码: <script type="text/javascript" > $(document).ready(function(){  bindListener(); }) function addimg(){  $("#mdiv").append('<div ><input type="file" name="img[]" /&

jquery动态添加删除div--事件绑定,对象克隆

我想做一个可以动态添加删除div的功能.中间遇到一个问题,最后在phpchina问答区版主的热心帮助下解答了(答案在最后)        使用到的jquery方法和思想就是:事件的绑定和销毁(unbind),另外还可以使用clone,通过克隆可以很好的解决这个问题          相关描述如下 功能:点击增加,自动添加一个iptdiv 点击 iptdiv后的 X 自动删除当前div 问题:默认存在的(也就是页面加载进来的)的那个iptdiv 后的 X 点击有效,可以删除当前 iptdiv  但

用Javascript动态添加删除HTML元素实例 (转载)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>用javascript动态添加删除html元素</title> <script type="text/jav

动态添加删除网卡 - 每天5分钟玩转 OpenStack(156)

这是 OpenStack 实施经验分享系列的第 6 篇. 在项目实施过程中,经常会有添加删除网卡的需求.比如一个运行数据库的 instance,初始只有一个网卡,数据库服务和备份共用这块网卡,后来为提高性能以及合规的要求需要加一块网卡专门做备份用.长久以来,Horizon 界面只支持在部署时为 instance 配置网卡,事后添加删除网卡只能用命令行,本节就来演示这个操作. 添加网卡 我们现在有一个 instance "c1",有一块 vlan111 的网卡,IP 为 17.17.11