100% CPU 利用率并在 virsh 迁移后挂起

100% CPU 利用率并在 virsh 迁移后挂起

我一直在尝试 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:amd64qemu-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.logsurya 上的以下消息。

2016-07-18T12:56:55.766929Z qemu-system-x86_64: warning: TSC frequency mismatch between VM and host, and TSC scaling unavailable

这是由于tsc_scalecpu 功能所致 - 8150 CPU (indra) 上有该功能,但 x4 940 (surya) 上缺少该功能。

有人知道问题是什么吗?或者如何解决?或调试建议?

它是否可以修复,或者是几代 Phenom II x4 940 中的 CPU 错误?

答案1

我找到了一个解决方案。

正如我所怀疑的,问题的原因是tsc_scalesurya 的 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

我可以在 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 是一种很酷的技术,我想用它玩一会儿……我已经很多年没有使用它了。

相关内容