Central-Processing-Unit

kvm 和 qemu 主機:最大 CPU 數是否有限制(Ubuntu 10.04)?

  • June 30, 2012

今天我們在兩台相同的 kvm 和 qemu 主機(Dell R910)上遇到了一個非常奇怪的行為。每個主機系統都有 4 x 10 Cores,這意味著 40 個物理核心在作業系統(Ubuntu Linux 10.04 64 Bit,Kernel 3.0)中顯示為 80。

我們在其中一個節點上啟動了一個 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 虛擬機時,也會出現幾分鐘的黑屏,但不會長達 15 分鐘。當在這台主機(Ubuntu 10.04)上啟動另一個虛擬機時,它也會出現黑屏問題,這裡也是黑屏僅顯示 2-3 分鐘(而不是 15 分鐘)。

因此,總結一下:每個相同節點上的每個客戶機在啟動後幾分鐘都會出現空閒。幾分鐘後,啟動過程突然開始。我們觀察到空閒時間發生在客戶機的 bios 初始化之後。

我們的一位員工的想法是在 Grub(核心參數)中限制 maxcpus=40(因為存在 40 個物理核心)的 CPU 數量,突然“黑屏空閒”行為消失了。

在 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,只有一個 VM。

編輯:我以 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 &lt;... read resumed&gt; "\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 &lt;unfinished ...&gt;
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 &lt;unfinished ...&gt;
25752 &lt;... futex resumed&gt; )             = 0
25734 &lt;... futex resumed&gt; )             = 1
25752 futex(0x927e60, FUTEX_WAKE_PRIVATE, 1 &lt;unfinished ...&gt;
25734 select(25, [7 10 14 15 16 17 18 24], [], [], {1, 0} &lt;unfinished ...&gt;

正如其中一條評論中的建議(感謝 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 中的一個錯誤)。

感謝所有的評論和你的努力!

引用自:https://serverfault.com/questions/401046