kvm 和 qemu 主机:最大 CPU (Ubuntu 10.04) 有限制吗?

Pyt*_*ner 6 central-processing-unit qemu kvm-virtualization pinning

今天我们在两个相同的 kvm 和 qemu 主机(戴尔 R910)上遇到了一个非常奇怪的行为。每个主机系统都有 4 x 10 个内核,这意味着 40 个物理内核在操作系统(Ubuntu Linux 10.04 64 位,内核 3.0)中显示为 80。

我们在其中一个节点上启动了一个 Windows 2003 32 位 VM(1 个 CPU,1 GB RAM,我们多次更改了这些值),并注意到启动过程开始需要 15 分钟。在这 15 分钟内,会显示黑屏,但没有任何反应。libvirt 和主机系统显示,guest 虚拟机的 qemu-kvm 进程几乎处于空闲状态。stracing 这个过程只显示了一些 FUTEX 条目,但没有什么特别的。

15 分钟后,Windows VM 突然开始启动并出现 Windows 徽标。几秒钟后,VM 就可以使用了。VM 本身的性能非常好,所以这不是性能问题。

我们尝试使用 virsh 和 taskset 工具固定 CPU,但这只会让事情变得更糟。

当我们使用 Linux Live CD 启动 Windows VM 时,也会出现几分钟的黑屏,但不会长达 15 分钟。在此主机(Ubuntu 10.04)上启动另一个 VM 时,它也有黑屏问题,这里也是黑屏只显示 2-3 分钟(而不是 15 分钟)。

因此,总结一下:每个相同节点上的每个来宾在启动后几分钟都会空闲。几分钟后,启动过程突然开始。我们观察到空闲时间发生在客户机的 bios 初始化之后。

我们的一位员工想在 Grub(内核参数)中限制 CPU 数量,maxcpus=40(因为存在 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
Run Code Online (Sandbox Code Playgroud)

编辑:还尝试了 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
Run Code Online (Sandbox Code Playgroud)

对于此系统,只有一个 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 
Run Code Online (Sandbox Code Playgroud)

编辑:根据要求,我将添加 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 ...>
Run Code Online (Sandbox Code Playgroud)

Pyt*_*ner 5

正如其中一条评论中所推荐的(感谢 cperrin88),Ubuntu 12.04 带来了解决方案。一些参数:

  • 内核 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 客户机现在在启动的前 30 秒内显示一个启动栏,然后只是启动(正常行为)。

与我之前的测试场景相比(每秒 200 到 24k),上下文切换的数量现在非常低。

所以,问题解决了。我只需要找出发生了什么变化(我猜这是 KVM 中的一个错误)。

感谢所有评论和您的努力!