libvirt/qemu特性之cpu hotplug

来源:互联网 发布:unity3d ugui对话框 编辑:程序博客网 时间:2024/05/18 04:39

声明:

本博客欢迎转发,但请保留原作者信息!

博客地址:http://blog.csdn.net/halcyonbaby

内容系本人学习、研究和总结,如有雷同,实属荣幸!


目前qemu(1.7)/libvirt(1.2)只实现了cpu 的hotadd功能。hot remove还在实现中。
libvirt进行cpu hot add的过程:
  1. 虚拟机中安装qemu-agent
  2. 配置libvirt xml
    <!-- 配置CPU数目 -->    <vcpu placement='auto' current="1">4</vcpu><!--(增加guest agent通道,详细参照guest agent章节)-->    <channel type='unix'>      <source mode='bind' path='/var/lib/libvirt/qemu/{$guestname}.agent'/>      <target type='virtio' name='org.qemu.guest_agent.0'/>    </channel>

  3. 启动虚拟机、在Guest中查看VCPU数目
    ls /sys/devices/system/cpu/

  4. 使用virsh命令增加VCPU
    virsh setvcpus domain 2 --live再在Guest中查看,发现有新增加的VCPUls /sys/devices/system/cpu/

  5. 使用virsh命令online新增加的VCPU
    virsh setvcpus domain 2 --guest在Guest中使用Top命令,可以看到有两个VCPU在使用

qemu进行cpu hotplug过程:
  1. 启动guest
    $ qemu-kvm -cpu host -enable-kvm -m 1024 -smp 1,maxcpus=4 -drive file=/data/hotplug/hotplug.qcow2,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -qmp tcp:localhost:4444,server

  2. 连接qmp命令
    $ telnet localhost 4444

  3. 运行qmp-check命令
    { "execute": "qmp_capabilities" }

  4. 添加vcpu
    { "execute": "cpu-add", "arguments": { "id": 2} }

  5. 在guest中将vcpu生效
    $ echo 1 > /sys/devices/system/cpu/cpu2/online

cpu hotplug原理:
目前linux2.6.14以后,windows2008 datacenter之后OS支持cpu hotplug功能。
CPU 的 Hot Add 为例描述这一过程:
  1. 用户将 CPU 插入一个空闲的 socket 中
  2. 用户通过 Hot Plug 的接口初始化 Hot Add 这一动作。接口可以是 OS 提供的 UI 接口,按一个按钮,或者是某些管理接口,如 IPMI,AMT
  3. firmware/BIOS 对插入的 CPU 进行必要的初始化操作,如配置 QPI 总线的路由表,更新地址解码等
  4. 通过 ACPI 中断接口(SCI 中断)向 OS 产生一个 Hot Add 的事件
  5. OS 在接收到这个 ACPI 事件后首先需要通过 ACPI 的 _OSI 方法检查当前系统是否支持”Module Device”的能力,如果是则表明可以进行 Hot Add 操作
  6. OS 通过 ACPI 的 _MAT 方法得到 MADT 描述表,用来初始化 Local APIC/SAPIC 以及 local NMI 中断
  7. OS 对新增的 CPU 进行相关的电源管理配置,如 P/C/T state
  8. OS 调用 ACPI 的 _OST 方法通知 firmware/BIOS 本次 Hot Add 成功与否

cpu hotplug价值:
  1. 满足用户SLA
  2. 利用空闲资源
  3. 动态扩展而无需重启虚拟机
其他:

对第X个CPU进行online操作

#echo 1 > /sys/devices/system/cpu/cpuX/online
查看有多少CPU工作

#cat /proc/interrupts
对第X个CPU进行offline操作

#echo 0 > /sys/devices/system/cpu/cpuX/online

参考:

http://www.ibm.com/developerworks/cn/linux/l-cn-ras/
http://www.mrz001.com/






0 0