Назад | Перейти на главную страницу

KVM top показывает высокую загрузку процессора на хосте для гостевой Windows7, хотя окна простаивают

у нас есть среда виртуализации с 4 виртуальными машинами (2 x linux, 1 x w2k3, 1 x win7). В хост-системе (Debian Jessie) top всегда показывает загрузку процессора 30-70% (или более) для процесса qemu гостевой системы win7, даже если диспетчер задач внутри гостевой системы имеет нулевую загрузку процессора.

    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). Также планшетное устройство удаляется из конфигурации, а устройство с раздувом отключено внутри гостя (так как я не знаю, как отключить его в конфигурации виртуальной машины). Кроме того, он также запускает сервер Pervasive SQL 8 для запуска старой базы данных btrieve.

Странно то, что загрузка ЦП сверху падает до адекватного уровня (1-3%), если я полностью удалю все сетевые адаптеры из гостевой системы. Фактически в качестве сетевой карты я прошел через одну из физических сетевых адаптеров (Intel I350). Но поведение виртуализированных сетевых адаптеров такое же. Все это тестировалось без подключения клиентов.

Фактическая гостевая конфигурация:

<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) в нашей среде. Клиентское программное обеспечение было установлено на этой конкретной виртуальной машине. После удаления клиентского программного обеспечения загрузка ЦП хоста упала до приемлемого уровня. Кажется, он все время искал связи. Удаление всех устройств virtio-serial принесло еще одно небольшое улучшение, теперь нагрузка на хост составляет около 2-3%, когда Windows простаивает. Спасибо за вашу помощь.

Раньше у меня была аналогичная проблема: прерывание IRQ в гостевой системе и высокая нагрузка на хост. Вы должны изолировать то, что в гостевой системе атакует ЦП. Основными кандидатами являются как экземпляр MSSQL, так и библиотека hal.dll.

Для отладки выполните следующие действия:

  • остановите свой экземпляр MSSQL. Уменьшается ли нагрузка на хост? Если да, то вы нашли виновного. Дело в том, что MSSQL использует высокую частоту таймера (1 мс) даже в режиме ожидания. На голом железе это не проблема (система просто потребляет еще несколько ватт), но на виртуализированном может быть проблемой. Если возможно, вам следует определить, какой источник таймера использует Windows, и попытаться переключиться между доступными. В качестве обходного пути существует патч, увеличивающий время прерывания таймера до 12 мс. Для получения дополнительной информации см. Вот и Вот.
  • если пункт №1 не приносит пользы, возможно, проблема связана с HAL. Я вижу, вы используете два виртуальных ЦП; попробуйте запустить виртуальную машину с одним vCPU. Это что-нибудь меняет? Если нет, сделайте снимок экрана вкладки оборудования Windows (расширяя узел HAL) и сообщите об этом здесь.

РЕДАКТИРОВАТЬ: Хорошо, похоже, что ни MSSQL, ни HAL не являются основной причиной загрузки вашего хоста. Переходим ко второй фазе отладки:

  • остановите вашу виртуальную машину и удалите из ее определения все USB-устройства. Перезагрузите машину и проверьте нагрузку на хост: она изменилась?
  • если нет, используйте powertop утилита для мониторинга активности процессора хоста. Здесь вы должны увидеть, какая программная процедура / прерывание обслуживается больше всего. Беги через 30 секунд и доложи сюда.