今天,我们在两台相同的kvm和qemu主机(Dell R910)上遇到了一个非常奇怪的行为。 每个主机系统都有4 x 10个核心,这意味着在操作系统(Ubuntu Linux 10.04 64 Bit,Kernel 3.0)中,有40个物理核心显示为80个。
我们在其中一个节点上启动了Windows 2003 32位虚拟机(1个CPU,1 GB RAM,我们多次更改这些值),并注意到启动过程需要15分钟。 在这15分钟内,黑屏显示,没有任何反应。 libvirt和主机系统显示guest虚拟机的qemu-kvm进程几乎空转。 对这个过程进行维护只会显示一些FUTEX条目,但没有特别之处。
在这15分钟之后,Windows VM突然启动并出现Windows徽标。 几秒钟后,虚拟机就可以使用了。 虚拟机本身是非常高性能的,所以这不是性能问题。
我们试图用virsh和taskset工具来固定CPU,但这只会让事情变得更糟。
当我们使用Linux Live CD启动Windows VM时,也会出现几分钟的黑屏,但不会长达15分钟。在此主机(Ubuntu 10.04)上启动另一台VM时,也会出现黑屏问题,黑屏只显示2-3分钟(而不是15)。
所以,这样做:这些相同节点上的每个访客在启动后几分钟内都会怠速。 几分钟后,启动过程突然开始。 我们观察到,空闲时间恰好在客人的BIOS初始化之后发生。
我们的一个员工有想法限制Grub(内核参数)中maxcpus = 40(因为有40个物理内核)的CPU数量,突然间“黑屏空闲”的行为消失了。
searchKVM和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 ...>
正如其中一个评论(谢谢cperrin88)推荐,Ubuntu 12.04带来了解决scheme。 一些参数:
Windows客户现在在启动的前30秒内显示一个启动栏,然后启动(正常行为)。
与之前的testing情况(每秒200到24k)相比,上下文切换的数量现在非常低。
所以,问题解决了。 我只需要找出什么改变(我想这是一个在KVM中的错误)。
感谢所有的评论和你的努力!
我在Ubuntu 10.04上遇到了很多KVM的bug。 (我仍然需要使用它),包括越来越多的交换caching和严重的性能问题。
我build议升级到最新的LTS版本,希望能修复一些错误。