儘管 Windows 處於空閒狀態,但 KVM 頂部顯示 Windows7 來賓主機上的 CPU 負載很高
我們有一個虛擬化環境,實際上有 4 個虛擬機(2 x linux、1 x w2k3、1 x win7)。在主機系統(Debian Jessie)中,即使來賓內部的任務管理器處於零 CPU 負載,但 win7 來賓的 qemu 程序的 CPU 負載始終顯示為 30-70%(或更多)。
top - 11:12:08 up 6 days, 1:47, 1 user, load average: 0,70, 0,62, 0,55 Tasks: 216 total, 2 running, 214 sleeping, 0 stopped, 0 zombie %Cpu(s): 5,0 us, 3,7 sy, 0,0 ni, 91,3 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st KiB Mem: 24776900 total, 21591188 used, 3185712 free, 122680 buffers KiB Swap: 3905532 total, 60748 used, 3844784 free. 399364 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 11138 libvirt+ 20 0 10,804g 8,243g 18536 R 70,1 34,9 2137:30 qemu-system-x86 12134 libvirt+ 20 0 7309216 6,046g 18792 S 3,7 25,6 139:13.88 qemu-system-x86 12055 libvirt+ 20 0 8900940 4,057g 18500 S 2,3 17,2 109:41.87 qemu-system-x86 12041 libvirt+ 20 0 2956240 1,388g 18292 S 2,0 5,9 61:38.55 qemu-system-x86 5569 root 20 0 1007924 23456 11012 S 1,0 0,1 1:16.86 libvirtd
來賓內部有一個 MSSQL 2008 R2 Express 正在執行。為此設置了 Traceflag -T8038(根據proxmox 性能調整)。平板電腦設備也從配置中刪除,並且在來賓內部禁用了氣球設備(因為我不知道如何在 VM 配置中禁用它)。此外,它還執行 Pervasive SQL 8 伺服器來觸發舊的 btrieve 數據庫。
奇怪的是,如果我從客戶機中完全刪除所有 NIC,頂部的 CPU 負載會下降到足夠的水平(1-3%)。實際上,作為 NIC,我通過了其中一個物理 NIC(Intel I350)。但是虛擬化 NIC 的行為是相同的。所有這些都在沒有連接任何客戶端的情況下進行了測試。
實際來賓配置:
<domain type='kvm'> <name>win7</name> <uuid>4b62c825-07ce-49b9-be8c-63f1f51ec28c</uuid> <memory unit='KiB'>8388608</memory> <currentMemory unit='KiB'>8388608</currentMemory> <vcpu placement='static'>2</vcpu> <os> <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type> </os> <features> <acpi/> <apic/> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> </hyperv> </features> <cpu mode='host-model'> <model fallback='allow'/> <topology sockets='1' cores='2' threads='1'/> </cpu> <clock offset='localtime'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> <timer name='hypervclock' present='yes'/> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source dev='/dev/vg_vm/lv_win7Pro'/> <target dev='vda' bus='virtio'/> <boot order='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hdb' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/> </controller> <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </controller> <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes'/> <video> <model type='qxl' ram='65536' vram='65536' heads='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x07' slot='0x00' function='0x1'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </hostdev> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </memballoon> </devices> </domain>
任何提示可能導致這種情況以及如何改進?
我找到了罪魁禍首。我們的環境中有一個 USB-over-IP 伺服器 ( Longshine LCS-US204 )。客戶端軟體安裝在該特定 VM 上。解除安裝客戶端軟體後,主機上的 CPU 負載下降到足夠的水平。似乎它一直在尋找連接。刪除所有 virtio-serial 設備帶來了另一個小的改進,現在當 windows 空閒時主機負載約為 2-3%。謝謝你的幫助。
過去我也遇到過類似的問題,IRQ 在來賓中突如其來,而主機上的負載很高。您必須隔離來賓中正在攻擊 CPU 的內容。主要候選對像是 MSSQL 實例和 hal.dll 庫。
要進行調試,請執行以下步驟:
- 停止您的 MSSQL 實例。主機負載是否減少?如果是這樣,你找到了罪魁禍首。關鍵是 MSSQL 使用較高的計時器頻率(1 毫秒),即使在空閒時也是如此。在裸機上這不是問題(系統只會使用更多的瓦特),但在虛擬化上可能是一個問題。如果可能,您應該確定 Windows 正在使用的計時器源並嘗試在可用的源之間切換。作為一種解決方法,有一個更新檔可以將時鐘定時器中斷提高到 12 毫秒。有關詳細資訊,請參閱此處和此處。
- 如果第 n.1 點沒有帶來任何好處,那麼問題可能與 HAL 相關。我看到你正在使用兩個 vCPU;嘗試使用單個 vCPU 啟動 VM。這有什麼改變嗎?如果不是,請對 Windows 的硬體選項卡進行螢幕截圖(擴展 HAL 節點)並在此處報告。
**編輯:**好的,似乎 MSSQL 和 HAL 都不是主機負載的根本原因。進入第二個調試階段:
- 停止您的虛擬機並從其定義中刪除所有 USB 設備。重新啟動機器並檢查主機負載:它改變了嗎?
- 如果沒有,請使用該
powertop
實用程序來監控主機的 CPU 活動。在這裡,您應該看到服務最多的軟體常式/中斷。執行 30 秒,然後在這里報告。