我一直在尝试 ZFS + DRBD + 实时迁移(我想充分理解它,以便在ganeti
再次开始使用之前编写自己的自动化脚本,然后是 openstack cinder
)。我的 ZFS + DRBD(双主模式)适用于共享存储。
然而,实时迁移只发挥了部分作用。
我有两台主机,具有相同的 libvirt 和 drbd 配置,甚至具有相同的 VM ZVOL 专用“卷”池(均为 2x1TB 镜像池 - 重新使用旧备份池中的一些旧磁盘),以及相同的 VM 配置(名为“d测试”)
“indra”是配备 16GB RAM 的 AMD FX-8150,搭载 ASUS Sabertooth 990FX m/b
- 中央处理器标志:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc extd_apicid aperfmperf eagerfpu pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 nodeid_msr topoext perfctr_core perfctr_nb cpb hw_pstate vmmcall arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold
- 中央处理器标志:
“surya”是 AMD Phenom II X4 940,配备 8GB RAM,搭载 ASUS M3A79-T DELUXE m/b
- 中央处理器标志
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc extd_apicid eagerfpu pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate vmmcall npt lbrv svm_lock nrip_save
- 中央处理器标志
两者都运行 debian sid,具有完全相同的软件包版本(包括libvirt* 2.0.0-1:amd64
和qemu-system-x86 1:2.6+dfsg-3
),并且具有相同的 Liquorix 内核:
Linux indra 4.6-2.dmz.2-liquorix-amd64 #1 ZEN SMP PREEMPT Debian 4.6-3 (2016-06-19) x86_64 GNU/Linux
Linux surya 4.6-2.dmz.2-liquorix-amd64 #1 ZEN SMP PREEMPT Debian 4.6-3 (2016-06-19) x86_64 GNU/Linux
VM 本身正在运行 debian sid,带有库存 debian 4.6.0-1 内核:
Linux dtest 4.6.0-1-amd64 #1 SMP Debian 4.6.3-1 (2016-07-04) x86_64 GNU/Linux
我可以在任一主机上启动虚拟机,并且运行良好。
我可以毫无问题地将虚拟机从 surya 迁移到 indra。当我尝试将虚拟机从 indra 迁移到 surya 时,迁移似乎已成功完成,但虚拟机因 100% CPU 使用率而挂起(对于分配给它的单核)。
无论虚拟机是在 indra 上启动然后迁移到 surya(挂起的位置),还是在 surya 上启动、迁移到 indra(到目前为止还好)然后迁移回 surya(挂起),都没有区别。
当虚拟机挂起时,我唯一能做的就是virsh destroy
(强制关闭)或virsh reset
(强制重新启动)。
我尝试使用以下方法禁用 kvm_steal_time:
<qemu:commandline>
<qemu:arg value='-cpu'/>
<qemu:arg value='qemu64,-kvm_steal_time'/>
</qemu:commandline>
但这并不能解决问题。
没有任何内容被登录或来自虚拟机本身。我收到的任何问题的唯一指示是/var/log/libvirt/qemu/dtest.log
surya 上的以下消息。
2016-07-18T12:56:55.766929Z qemu-system-x86_64: warning: TSC frequency mismatch between VM and host, and TSC scaling unavailable
这是由于tsc_scale
cpu 功能所致 - 8150 CPU (indra) 上有该功能,但 x4 940 (surya) 上缺少该功能。
有人知道问题是什么吗?或者如何解决?或调试建议?
它是否可以修复,或者是几代 Phenom II x4 940 中的 CPU 错误?
答案1
我找到了一个解决方案。
正如我所怀疑的,问题的原因是tsc_scale
surya 的 CPU 的功能标志缺失。
事实证明,您可以将虚拟机从没有tsc_scale
它的主机迁移到有它的主机,但是运行在有它的主机上的虚拟机tsc_scale
可以仅有的与它一起迁移到另一台主机。
是时候提交错误报告了。
我创建了另一个基于 ZFS ZVOL 的 DRBD,这次是在 surya 和网络上的另一台机器(我的主服务器)之间ganesh
。
- ganesh 是 AMD Phenom II 1090T,配备 32GB RAM,搭载 ASUS Sabertooth 990FX m/b
- CPU 标志:
fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc extd_apicid aperfmperf eagerfpu pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt nodeid_msr cpb hw_pstate vmmcall npt lbrv svm_lock nrip_save pausefilter
- CPU 标志:
我可以在 surya 和 ganesh 之间来回迁移虚拟机,没有任何问题,并且我可以将虚拟机从 surya 或 ganesh 迁移到 indra。但我无法将虚拟机从 indra 迁移到 surya 或 ganesh。
我现在可以忍受这个。当新的 AMD Zen CPU 发布时,ganesh 将进行升级,surya 将获得 ganesh 当前的主板和 RAM。我将同时为其购买新的 FX-6300 或 FX-8320,因此所有机器都会有tsc_scale
.
我在网络上有另一台机器(kali),带有 FX-8320 CPU(也具有该tsc_scale
功能)。我已经计划在升级 ganesh 上的主 zpool(从 4x1TB RAIDZ 到 2x4TB 镜像)并释放更多旧磁盘后立即将其添加到 ZVOL+DRBD+实时迁移实验中,这样我就能够在 indra 和 kali 之间,或在 surya 和 ganesh 之间来回迁移虚拟机。
我的虚拟机实验计划的下一阶段是编写脚本,以完全自动化设置虚拟机以在 ZVOL 上使用 DBRD 的过程,并在主机之间迁移虚拟机。
当我让它运行良好时,我将废弃它并开始使用 ganeti,它已经完成了我计划编写的内容(但更完整、更好)。
最后,当我对此感到厌倦时,我将切换到 openstack 并使用 cinder 进行卷管理。我很想跳过 ganeti 直接使用 openstack,但 ganeti 是一种很酷的技术,我想用它玩一会儿……我已经很多年没有使用它了。