https://blog.51cto.com/12814931/2130733
所谓热迁移,就是在用户无感知的情况下,把虚机由远端迁移到目的端。
一、原理理解
KVM的热迁移分为共享存储和非共享存储两种,其最终目的都是为了将内存和磁盘中的数据转移到目的端。总共要进行5个阶段
源端:
1、set_params阶段:此阶段根据热迁命令与参数,遍历savevm_handlers链表,初始化各个模块的迁移特征参数,完成后向目的端发送qemu_put_be_32(f, QEMU_VM_FILE_MAGIC),由此进入setup阶段
2、setup阶段:这个阶段会遍历savevm_handlers,将所有需要热迁设备的section_id,idstr,instance_id,version_id信息传递到目的端,并调用各个设备的setup函数
3、iterate阶段:此阶段会反复遍历savevm_handlers链表上的所有设备,调用iterate函数进行数据传递,传输完成后,调用vm_stop,暂停源端,进入complete阶段。
4、complete阶段:用来传递最后的脏页与迁移信息的清理。
目的端:
1、load阶段
接收源端需要迁移的设备列表,从savevm_handlers列表中找到对应设备的处理函数,并以此初始化loadvm_handlers链表。然后,根据源端传递来的数据,从loadvm_handlers中拿到对应的load函数,并加载数据。
二、热迁常用技巧
(1)三种场景速度差别
目前热迁有三种场景,千兆场景(速度大概是75MB),万兆场景(速度大概是300MB),属于万兆场景但迁移速度上不来(约100MB左右)。第三种情况可能是由于内存降速引起。
(2)评估迁移时间
watch -n 1 "virsh domjobinfo uuid"
可以通过上面命令,看下迁移速度再评估最后中断时间
可以查看/usr/local/var/log/libvirt/qemu/uuid.log,里面有个remaining值,这个值就是迁不动的page数(乘以4后是kb)。看这个值就可以看出还剩多少内存没有迁走
三、内存降速问题
有时母机会出现内存降速问题,导致系统读取磁盘到内存速度降低。这时可以在发起迁移前,使用taskset绑定子机的qemu主线程到未降速的numa上,能提升迁移速度。
(1) 确认降速的numa节点。有两个方法。
a) 通过母机上/tmp/test_mem/test_mem.sh脚本测试当前numa空闲可用速度。结果在numa0.log,numa1.log,test_mem.log中。
b) 通过上传pcm-memory.x这个脚本,查看numa实时使用的速度,确认内存变化(这里要根据子机所在的numa,看numa的写内存。因为迁移是把已有的内存置为脏页,只能读,不能写。然后子机需要写内存的时候,就新申请内存。所以内存变化主要看写内存速度),决定中断时长。这个脚本需要:
echo 0 > /proc/sys/kernel/nmi_watchdog设置系统参数
./pcm-memory.x 执行脚本,查看实时速度
echo 1> /proc/sys/kernel/nmi_watchdog用完后恢复系统参数
(2) numactl- - hardware,查看降速numa对应的cpu。
(3) virsh vcpuinfo uuid,获取子机的cpu分布。或着 /usr/sbin/tools/cvminfo也可以看到。【这里的cvm是腾讯云吗?】
(4) taskset –pc 6-11,18-23 pid,把子机的qemu主线程绑定到另外一个numa上。这里用vcpu命令绑核没有作用。
(5) 发起迁移,就能解决内存降速导致的迁移速度慢问题。这个操作能提高点迁移速度