Высокое потребление CPU в простое, виртуализация QEMU и Windows 10 / Server 2019

Начиная с релиза Windows 1803 замечено высокое потребление процессора при простое виртуальной машины под управлением данной ОС, а именно 20-30%. В то время как прошлые релизы и, например, Windows 7 потребляют 0-5%. Тоже самое относится к Windows Server 2019.

Поиск в интернете привёл к багтреккеру: https://bugzilla.redhat.com/show_bug.cgi?id=1610461

Итого, необходимо в секции hyperv конфигурационного файла VM добавить следующие параметры (я оставил только их):

<hyperv>
    <synic state='on'/>
    <stimer state='on'/>
</hyperv>

Данный рецепт подходит для версий ниже чем QEMU 3.1.0 / Kernel 4.19, для версий выше необходимо также включать <vpindex state=’on’/>, подробнее написано дальше в статье.

После чего виртуальная машина стала более отзывчивой, и потребление процессора в хост системе понизилось до нормальных значений.

Важно, что данные параметры поддерживают не все ядра. Я использую Centos 7 и долгое время оставался на ядре 3.10.0-693.11.1.el7.x86_64 из-за особенностей работы dlm и поддержки corosync отказоустойчивых колец. С данным ядром и указанными параметрами стартовать виртуальную машину не удалось. Обновился до текущего ядра 3.10.0-1160.49.1.el7.x86_64 где всё заработало.

Моя версия ПО: QEMU emulator version 2.12.0 (qemu-kvm-ev-2.12.0-44.1.el7_8.1)
Сама проблема кроется в следующем: Another sad thing is that MS doesn't provide dynamic frequency divider reprogramming for RTC periodic interrupt anymore (at least on 1803 and RS5), which makes RTC a kind of useless for Windows VMs due to very high default (hardcoded) RTC periodic timer interrupts rate.

UPD 2023/01/19

Для версий выше QEMU 3.1.0 / Kernel 4.19, которые поддерживают synIC только при включённом hv-vpindex, необходимо определить следующие параметры в секциях:

<features>
   ...
   <hyperv>
      <relaxed state='on'/>
      <vpindex state='on'/>
      <synic state='on'/>
      <stimer state='on'/>
   </hyperv>
   ...
</features>

<clock offset='localtime'>
   <timer name='rtc' tickpolicy='catchup'/>
   <timer name='pit' tickpolicy='delay'/>
   <timer name='hpet' present='no'/>
   <timer name='hypervclock' present='yes'/>
</clock>

Ссылки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика