Sql-Server

儘管 Windows 處於空閒狀態,但 KVM 頂部顯示 Windows7 來賓主機上的 CPU 負載很高

  • January 8, 2016

我們有一個虛擬化環境,實際上有 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 秒,然後在這里報告。

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