目前qemu(1.7)/libvirt(1.2)只实现了cpu 的hotadd功能。hot remove还在实现中。
libvirt进行cpu hot add的过程:
libvirt进行cpu hot add的过程:
- 虚拟机中安装qemu-agent
- 配置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>
- 启动虚拟机、在Guest中查看VCPU数目
- ls /sys/devices/system/cpu/
- 使用virsh命令增加VCPU
- virsh setvcpus domain 2 --live
- 再在Guest中查看,发现有新增加的VCPU
- ls /sys/devices/system/cpu/
- 使用virsh命令online新增加的VCPU
- virsh setvcpus domain 2 --guest
- 在Guest中使用Top命令,可以看到有两个VCPU在使用
qemu进行cpu hotplug过程:
- 启动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
- 连接qmp命令
- $ telnet localhost 4444
- 运行qmp-check命令
- { "execute": "qmp_capabilities" }
- 添加vcpu
- { "execute": "cpu-add", "arguments": { "id": 2} }
- 在guest中将vcpu生效
- $ echo 1 > /sys/devices/system/cpu/cpu2/online
-
cpu hotplug原理:
目前linux2.6.14以后,windows2008 datacenter之后OS支持cpu hotplug功能。
CPU 的 Hot Add 为例描述这一过程:
- 用户将 CPU 插入一个空闲的 socket 中
- 用户通过 Hot Plug 的接口初始化 Hot Add 这一动作。接口可以是 OS 提供的 UI 接口,按一个按钮,或者是某些管理接口,如 IPMI,AMT
- firmware/BIOS 对插入的 CPU 进行必要的初始化操作,如配置 QPI 总线的路由表,更新地址解码等
- 通过 ACPI 中断接口(SCI 中断)向 OS 产生一个 Hot Add 的事件
- OS 在接收到这个 ACPI 事件后首先需要通过 ACPI 的 _OSI 方法检查当前系统是否支持”Module Device”的能力,如果是则表明可以进行 Hot Add 操作
- OS 通过 ACPI 的 _MAT 方法得到 MADT 描述表,用来初始化 Local APIC/SAPIC 以及 local NMI 中断
- OS 对新增的 CPU 进行相关的电源管理配置,如 P/C/T state
- OS 调用 ACPI 的 _OST 方法通知 firmware/BIOS 本次 Hot Add 成功与否
cpu hotplug价值:
- 满足用户SLA
- 利用空闲资源
- 动态扩展而无需重启虚拟机
其他:
对第X个CPU进行online操作
- #echo 1 > /sys/devices/system/cpu/cpuX/online
- #cat /proc/interrupts
- #echo 0 > /sys/devices/system/cpu/cpuX/online
参考:
http://www.ibm.com/developerworks/cn/linux/l-cn-ras/
http://www.mrz001.com/