每个主机系统都有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分.当在此主机(Ubuntu 10.04)上启动另一台虚拟机时,它也会出现黑屏问题,此处也是黑屏只显示2-3分钟(而不是15分钟).
所以,夏天这个:
每个相同节点上的每个客户在启动几分钟后都会空转.几分钟后,启动过程突然开始.
我们观察到空闲时间恰好在客人的BIOS被初始化之后发生.
我们的一位员工有想法在Grub(内核参数)中限制maxcpus = 40(因为存在40个物理内核)的cpu数量,突然“黑屏空闲”行为消失了.
搜索KVM和Qemu邮件列表,互联网,论坛,服务器故障和其他各种已知错误的网站都没有显示有用的结果.即使在开发IRC频道中询问也没有带来任何新想法.那里的人建议我们使用cpu固定,但如前所述它没有帮助.
我现在的问题是:对于qemu或kvm主机系统,是否有一种cpu限制?浏览这两个工具的源代码表明,如果主机的cpu数超过255,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
对于具有一个VM的该系统,正常值将为大约7000.
编辑:
我使用maxcpus = 40作为启动参数启动了主机系统. virsh nodeinfo显示40个物理内核,没有超线程内核.
启动虚拟机时,它仍然具有大约30秒的“启动中断”.在此期间,上下文切换量从300(每秒)上升到600 000(每秒).在黑屏30秒后,VM启动正常启动过程,并且上下文切换下降到<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,250000}},NULL) = 0 25734 timer_gettime(0x1,182592}}) = 0 25734 futex(0x927e60,FUTEX_WAKE_PRIVATE,1 <unfinished ...> 25752 <... futex resumed> ) = 0 25734 <... futex resumed> ) = 1 25752 futex(0x927e60,1 <unfinished ...> 25734 select(25,[7 10 14 15 16 17 18 24],[],{1,0} <unfinished ...>
>内核3.2
> 80个核心(40个物理,80个因为Intel 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 guest虚拟机现在在启动的前30秒内显示一个启动栏,然后启动(正常行为).
与我之前的测试情况(每秒200到24k之间)相比,上下文切换的数量现在非常低.
所以问题解决了.我只需要找出改变了什么(我猜这是KVM中的一个错误).
感谢所有评论和您的努力!