kvm 和 qemu 主機:最大 CPU 數是否有限制(Ubuntu 10.04)?
今天我們在兩台相同的 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 <... 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 帶來了解決方案。一些參數:
- 核心 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 中的一個錯誤)。
感謝所有的評論和你的努力!