LINUX.ORG.RU
ФорумAdmin

Огромный CPU usage у виртуальной машины

 , ,


1

5

Есть проблема с виртуальной машиной QEMU-KVM, в последнее время CPU USAGE процесса qemu-system-x86_64 стала время от времени увеличиваться до 98%, при этом сильно тормозит запущенная на виртуалке винда. Что можно сделать?

/usr/bin/qemu-system-x86_64 
   -machine accel=kvm 
   -name guest=Windows,debug-threads=on 
   -S 
   -object secret,id=masterKey0,format=raw,file=/var/lib/libvirt/qemu/domain-1-Windows/master-key.aes
   -machine pc-q35-2.5,accel=kvm,usb=off,dump-guest-core=off 
   -cpu host 
   -bios /usr/share/seabios/bios.bin
   -m 2072 
   -overcommit mem-lock=off
   -smp 1,sockets=1,cores=1,threads=1 
   -uuid 18f7810b-6575-4155-ae98-3a5a13a8b7ff 
   -no-user-config 
   -nodefaults 
   -chardev socket,id=charmonitor,fd=33,server,nowait 
   -mon chardev=charmonitor,id=monitor,mode=control
   -rtc base=localtime 
   -no-shutdown 
   -boot strict=on
   -device pcie-root-port,port=0x10,chassis=1,id=pci.1,bus=pcie.0,multifunction=on,addr=0x2 
   -device pcie-root-port,port=0x11,chassis=2,id=pci.2,bus=pcie.0,addr=0x2.0x1 
   -device pcie-root-port,port=0x12,chassis=3,id=pci.3,bus=pcie.0,addr=0x2.0x2 
   -device pcie-root-port,port=0x13,chassis=4,id=pci.4,bus=pcie.0,addr=0x2.0x3 
   -device pcie-root-port,port=0x14,chassis=5,id=pci.5,bus=pcie.0,addr=0x2.0x4 
   -device qemu-xhci,id=usb,bus=pci.2,addr=0x0 
   -drive file=/srv/virtual/windows10-hdd.img,format=raw,if=none,id=drive-virtio-disk0 
   -device virtio-blk-pci,scsi=off,bus=pci.3,addr=0x0,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 
   -netdev tap,fd=35,id=hostnet0,vhost=on,vhostfd=36 
   -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:93:3c:88,bus=pci.1,addr=0x0 
   -vnc 10.0.3.159:2 
   -device virtio-vga,id=video0,virgl=on,max_outputs=1,bus=pcie.0,addr=0x1 
   -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny 
   -msg timestamp=on

Запускается qemu-system-x86_64 через libvirt.

<domain type='kvm' id='1'>
  <name>Windows</name>
  <uuid>18f7810b-6575-4155-ae98-3a5a13a8b7ff</uuid>
  <memory unit='KiB'>2121728</memory>
  <currentMemory unit='KiB'>2121728</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <resource>
    <partition>/machine</partition>
  </resource>
  <os>
    <type arch='x86_64' machine='pc-q35-2.5'>hvm</type>
    <loader readonly='yes' type='rom'>/usr/share/seabios/bios.bin</loader>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <kvm>
    </kvm>
  </features>
  <cpu mode='host-passthrough' check='none'/>
  <clock offset='localtime'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/srv/virtual/windows10-hdd.img'/>
      <backingStore/>
      <target dev='sda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
    </disk>
    <controller type='usb' index='0' model='qemu-xhci'>
      <alias name='usb'/>
      <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
    </controller>
    <controller type='sata' index='0'>
      <alias name='ide'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pcie-root'>
      <alias name='pcie.0'/>
    </controller>
    <controller type='pci' index='1' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='1' port='0x10'/>
      <alias name='pci.1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
    </controller>
    <controller type='pci' index='2' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='2' port='0x11'/>
      <alias name='pci.2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
    </controller>
    <controller type='pci' index='3' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='3' port='0x12'/>
      <alias name='pci.3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
    </controller>
    <controller type='pci' index='4' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='4' port='0x13'/>
      <alias name='pci.4'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
    </controller>
    <controller type='pci' index='5' model='pcie-root-port'>
      <model name='pcie-root-port'/>
      <target chassis='5' port='0x14'/>
      <alias name='pci.5'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:93:3c:88'/>
      <source bridge='br1'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
    <input type='mouse' bus='ps2'>
      <alias name='input0'/>
    </input>
    <input type='keyboard' bus='ps2'>
      <alias name='input1'/>
    </input>
    <graphics type='vnc' port='5902' autoport='no' listen='10.0.3.159'>
      <listen type='address' address='10.0.3.159'/>
    </graphics>
    <video>
      <model type='virtio' heads='1' primary='yes'>
        <acceleration accel3d='yes'/>
      </model>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
    <memballoon model='none'/>
  </devices>
  <seclabel type='dynamic' model='dac' relabel='yes'>
    <label>+107:+107</label>
    <imagelabel>+107:+107</imagelabel>
  </seclabel>
</domain>
★★★★★

  1. Однопоток для Windows – плохая идея. Это, конечно, – главный косяк тут.

  2. Какая версия Windows? Обратите внимание на hyperv features.

  3. virtio-blk лучше заменить на virtio-scsi.

  4. video virtio и accel3d выкинуть, оно в Windows не поддерживается. Только QXL.

Если это не поможет – профайлер в руки и вперед.

i586 ()
Ответ на: комментарий от i586

Кстати, косвенно могу подтвердить.

Правда, наблюдал похожее на Windows XP в VirtualBox (через KVM), но тоже загрузка единственного CPU была близка к 100%, причём эти 100% в основном состояли из kernel times (красный график в Task Manager, ср. с sys и user в выводе утилиты time в UNIX).

При добавлении по меньшей мере ещё одного виртуального CPU к гостевой VM нагрузка на host CPU резко падала.

Bass ★★★★ ()
Ответ на: комментарий от sunny1983

Но при этом «гость» не всегда ведёт себя адекватно, и в этом случае хост-оптимизации лишены смысла.

Но, так или иначе, у меня идеи закончились.

Bass ★★★★ ()

Про win10 не скажу, но с win7 у kvm такие проблемы были. И второй процессор у меня тоже ситуацию не улучшал, а скорее наоборот. В итоге свалил на virtualbox.

suspend ()
Ответ на: комментарий от Bass

Может быть я неправильно понимаю как полная виртуализация работает. Вот есть гостевая винда в которой работает некоторое количество процессов, из хостовой системы я эти процессы не вижу, а вижу только один процесс qemu-system-x86_64. В процессорах AMD есть технология AMD-V, благодаря которой процессы гостевой системы выполняются как отдельные процессы, а не как один большой процесс, собственно вопрос хост-оптимизации оптимизации был как раз в том можно ли на уровне гипервизора какие-то лимиты для гостевой системы выставить, чтобы винда не смогла все ресурсы сожрать.

sunny1983 ★★★★★ ()