今天我们在两台相同的 kvm 和 qemu 主机(Dell R910)上遇到了一个非常奇怪的行为。主机系统各有 4 x 10 核心,这意味着 40 个物理核心在操作系统中显示为 80 个(Ubuntu Linux 10.04 64 位,内核 3.0)。
我们在其中一个节点上启动了 Windows 2003 32 位 VM(1 个 CPU、1 GB RAM,我们多次更改了这些值),并注意到启动过程需要 15 分钟才能开始。在这 15 分钟内,屏幕变黑,什么也没发生。libvirt 和主机系统显示客户机的 qemu-kvm 进程几乎处于空闲状态。跟踪此进程仅显示一些 FUTEX 条目,但没有什么特别的。
15 分钟后,Windows VM 突然开始启动并出现 Windows 徽标。几秒钟后,VM 即可使用。VM 本身性能非常出色,因此这不是性能问题。
我们尝试使用 virsh 和 taskset 工具来固定 CPU,但这只会让事情变得更糟。
当我们使用 Linux Live CD 启动 Windows VM 时,也会出现黑屏几分钟,但不会长达 15 分钟。在此主机上启动另一台 VM(Ubuntu 10.04)时,也会出现黑屏问题,而且这里的黑屏只显示 2-3 分钟(而不是 15 分钟)。
因此,总结一下:每个相同节点上的每个客户机在启动后都会出现空闲状态。几分钟后,启动过程突然开始。我们观察到空闲时间发生在客户机的 bios 初始化之后。
我们的一名员工想出了一个想法,在 Grub(内核参数)中用 maxcpus=40 来限制 CPU 的数量(因为存在 40 个物理核心),然后“黑屏空闲”现象就消失了。
在 KVM 和 Qemu 邮件列表、互联网、论坛、serverfault 和其他各种网站上搜索已知错误等,没有找到有用的结果。即使在开发 IRC 频道中提问也没有带来新的想法。那里的人建议我们使用 CPU 固定,但正如之前所说,它没有帮助。
我现在的问题是:qemu 或 kvm 主机系统是否存在某种 CPU 限制?浏览这两个工具的源代码显示,如果您的主机拥有超过 255 个 CPU,KVM 会发出警告。但我们甚至还没有触及该限制。
关于主机系统的一些内容:
3.0.0-20-server
kvm 1:84+dfsg-0ubuntu16+0.14.0+noroms+0ubuntu4
kvm-pxe 5.4.4-7ubuntu2
qemu-kvm 0.14.0+noroms-0ubuntu4
qemu-common 0.14.0+noroms-0ubuntu4
libvirt 0.8.8-1ubuntu6
4 x Intel(R) Xeon(R) CPU E7-4870 @ 2.40GHz, 10 Cores
编辑:还尝试了 3.2 内核(未使用 maxcpus 参数) - 不幸的是,这使情况变得更糟。dstat 显示上下文切换的数量不断增加:
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 99 0 0 0|1164k 638k| 0 0 | 0 0 |4972 6319
0 1 99 0 0 0| 0 0 |3456B 4847B| 0 0 | 18k 33k
0 1 99 0 0 0| 0 0 |6126B 4550B| 0 0 | 17k 33k
0 1 99 0 0 0| 0 0 |1772B 4139B| 0 0 | 17k 33k
0 1 99 0 0 0| 0 0 |5507B 3674B| 0 0 | 17k 32k
对于启动了一个虚拟机的系统,正常值应该在 7000 左右。
编辑:我使用 maxcpus=40 作为启动参数启动了主机系统。virsh nodeinfo 显示有 40 个物理核心,没有超线程核心。
启动虚拟机时,它仍然有大约 30 秒的“启动中断”。在此期间,上下文切换次数从每秒 300 次上升到每秒 600 000 次。黑屏 30 秒后,虚拟机开始正常启动过程,上下文切换次数降至每秒 <7000 次:
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
1 2 97 0 0 0| 943k 0 | 26k 12k| 0 0 | 22k 40k
3 7 84 6 0 0| 26M 64k| 71k 18k| 0 0 | 10k 16k
1 1 97 1 0 0|5282k 2560B|9751B 15k| 0 0 | 13k 23k
1 4 95 0 0 0|1216k 0 | 14k 18k| 0 0 | 295k 592k
1 3 96 0 0 0| 0 52k|5518B 7299B| 0 0 | 228k 456k
1 3 96 0 0 0| 12k 24k|1228B 1514B| 0 0 | 258k 518k
1 4 96 0 0 0| 0 0 | 14k 32k| 0 0 | 280k 565k
1 3 96 0 0 0| 0 0 | 19k 38k| 0 0 | 284k 573k
1 3 96 0 0 0| 0 0 |6465B 7203B| 0 0 | 288k 581k
1 3 96 0 0 0| 0 172k| 26k 11k| 0 0 | 290k 584k
1 3 96 0 0 0| 0 0 | 23k 11k| 0 0 | 288k 580k
1 3 96 0 0 0| 0 12k|5678B 4556B| 0 0 | 289k 583k
1 3 96 0 0 0| 0 0 |1192B 2929B| 0 0 | 288k 580k
1 3 96 0 0 0| 0 0 |6304B 10k| 0 0 | 272k 547k
1 3 96 0 0 0|4096B 52k|8330B 14k| 0 0 | 300k 605k
1 3 96 0 0 0| 0 24k| 11k 20k| 0 0 | 293k 591k
1 3 96 0 0 0| 0 0 | 13k 28k| 0 0 | 291k 587k
1 3 96 0 0 0| 0 512B| 10k 18k| 0 0 | 291k 587k
2 3 95 0 0 0| 0 0 |6653B 10k| 0 0 | 167k 337k
3 0 97 0 0 0| 0 160k| 23k 5524B| 0 0 | 10k 19k
7 0 92 0 0 0| 0 36k| 22k 3335B| 0 0 | 949 924
10 0 90 0 0 0| 0 0 |5172B 3318B| 0 0 | 908 923
5 0 94 0 0 0| 0 0 |2234B 2825B| 0 0 | 846 875
编辑:根据要求,我将添加 strace -f -p 的摘录:
25734 <... read resumed> "\16\0\0\0\0\0\0\0\376\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0"..., 128) = 128
25752 futex(0x927e60, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
25734 rt_sigaction(SIGALRM, NULL, {0x4b2300, ~[KILL STOP RTMIN RT_1], SA_RESTORER, 0x7fe09ac108f0}, 8) = 0
25734 write(8, "\1\0\0\0\0\0\0\0", 8) = 8
25734 read(15, 0x7fffcea69f70, 128) = -1 EAGAIN (Resource temporarily unavailable)
25734 timer_gettime(0x1, {it_interval={0, 0}, it_value={0, 0}}) = 0
25734 timer_settime(0x1, 0, {it_interval={0, 0}, it_value={0, 250000}}, NULL) = 0
25734 timer_gettime(0x1, {it_interval={0, 0}, it_value={0, 182592}}) = 0
25734 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
25752 <... futex resumed> ) = 0
25734 <... futex resumed> ) = 1
25752 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
25734 select(25, [7 10 14 15 16 17 18 24], [], [], {1, 0} <unfinished ...>
答案1
正如评论中推荐的那样(感谢 cperrin88),Ubuntu 12.04 提供了解决方案。一些参数:
- 内核 3.2
- 80 个核心(40 个物理核心,80 个因采用英特尔 HT 而增加)
- kvm 1:84+dfsg-0ubuntu16+1.0+noroms+0ubuntu13
- kvm-ipxe 1.0.0+git-3.55f6c88-0ubuntu1
- qemu-kvm 1.0+noroms-0ubuntu13
- libvirt 0.9.8-2ubuntu17.1
Windows 客户机现在在启动的前 30 秒内显示启动栏,然后就开始启动(正常行为)。
与我之前的测试场景相比,上下文切换的数量现在非常低(每秒 200 到 24k 之间)。
所以,问题解决了。我只需要找出发生了什么变化(我猜是 KVM 中的一个错误)。
感谢所有评论和您的努力!
答案2
我在 Ubuntu 10.04 上使用 KVM 时遇到了不少错误(我仍然必须使用它),包括不断增长的交换缓存和严重的性能问题。
我建议升级到最新的 LTS 版本,希望它能修复一些错误。