Questo contenuto non è disponibile nella lingua selezionata.

Chapter 4. Optimizing Windows virtual machines


When using Microsoft Windows as a guest operating system in a virtual machine (VM) hosted in RHEL 10, the performance of the guest might be negatively impacted.

To optimize the performance of your Windows VMs, you can use a variety of strategies, including paravirtualized drivers, Hyper-V enlightenments, and disabling Windows background processes.

4.1. Installing KVM paravirtualized drivers for Windows virtual machines

The primary method of improving the performance of your Windows virtual machines (VMs) is to install KVM paravirtualized (virtio) drivers for Windows on the guest operating system.

Note

The virtio-win drivers are certified (WHQL) against the latest releases of Windows 10 and 11, available at the time of the respective virtio-win release. However, virtio-win drivers are generally tested and expected to function correctly on previous builds of Windows 10 and 11 as well.

4.1.1. How Windows virtio drivers work

Paravirtualized drivers enhance the performance of virtual machines (VMs) by decreasing I/O latency and increasing throughput to almost bare metal levels. You can use paravirtualized drivers for VMs that run I/O-heavy tasks and applications.

virtio drivers are KVM’s paravirtualized device drivers, available for Windows VMs running on KVM hosts. These drivers are provided by the virtio-win package, which includes drivers for:

  • Block (storage) devices
  • Network interface controllers
  • Video controllers
  • Memory ballooning device
  • Paravirtualized memory device
  • Paravirtual serial port device
  • Entropy source device
  • Paravirtual panic device
  • Input devices, such as mice, keyboards, or tablets
  • VirtIO FS Device
  • QEMU FwCfg Device
  • A small set of emulated devices

By using KVM virtio drivers, the following Microsoft Windows versions are expected to run similarly to physical systems:

4.1.2. Preparing virtio driver installation media on a host machine

To install or update KVM virtio drivers on a Windows virtual machine (VM), you must first prepare the virtio driver installation media on the host machine. To do so, attach the .iso file, provided by the virtio-win package, as a storage device to the Windows VM.

Prerequisites

Procedure

  1. Refresh your subscription data:

    # subscription-manager refresh
    All local data refreshed
  2. Get the latest version of the virtio-win package.

    • If virtio-win is not installed:

      # dnf install -y virtio-win
    • If virtio-win is installed:

      # dnf upgrade -y virtio-win

      If the installation succeeds, the virtio-win driver files are available in the /usr/share/virtio-win/ directory. These include ISO files and a drivers directory with the driver files in directories, one for each architecture and supported Windows version.

      # ls /usr/share/virtio-win/
      agents.json drivers/ guest-agent/ info.json /installer /qxl-wddm-dod release-drivers-versions.txt /spice-vdagent /tools virtio-win-1.9.45.iso virtio-win.iso
  3. Attach the virtio-win.iso file as a storage device to the Windows VM.

    • When creating a new Windows VM, attach the file by using the virt-install command options.
    • When installing the drivers on an existing Windows VM, attach the file as a CD-ROM by using the virt-xml utility:

      # virt-xml WindowsVM --add-device --disk virtio-win.iso,device=cdrom
      Domain 'WindowsVM' defined successfully.

4.1.3. Installing virtio drivers on a Windows guest

To install KVM virtio drivers on a Windows guest operating system, you must add a storage device that contains the drivers (either when creating the virtual machine (VM) or afterwards) and install the drivers in the Windows guest operating system.

This procedure provides instructions to install the drivers by using the graphical interface. You can also use the Microsoft Windows Installer (MSI) command-line interface.

Prerequisites

Procedure

  1. In the Windows guest operating system, open the File Explorer application.
  2. Click This PC.
  3. In the Devices and drives pane, open the virtio-win medium.
  4. Based on the operating system installed on the VM, run one of the installers:

    • If using a 32-bit operating system, run the virtio-win-gt-x86.msi installer.
    • If using a 64-bit operating system, run the virtio-win-gt-x64.msi installer.
  5. In the Virtio-win-driver-installer setup wizard that opens, follow the displayed instructions until you reach the Custom Setup step.

    Image displaying the Virtio-win-guest-tools setup wizard.
  6. In the Custom Setup window, select the device drivers you want to install. The recommended driver set is selected automatically, and the descriptions of the drivers are displayed on the right of the list.
  7. Click next, then click Install.
  8. After the installation completes, click Finish.
  9. Reboot the VM to complete the driver installation.

Verification

  1. On your Windows VM, navigate to the Device Manager:

    1. Click Start
    2. Search for Device Manager
  2. Ensure that the devices are using the correct drivers:

    1. Click a device to open the Driver Properties window.
    2. Navigate to the Driver tab.
    3. Click Driver Details.

Next steps

4.1.4. Updating virtio drivers on a Windows guest

To update KVM virtio drivers on a Windows guest operating system (OS), you can use the Windows Update service.

If the OS version does not support Windows Update, you can reinstall the drivers from virtio driver installation media attached to the Windows virtual machine (VM).

Prerequisites

Procedure

  • On Windows 10, Windows Server 2016 and later operating systems, check if the driver updates are available by using the Windows Update graphical interface:

    1. Start the Windows VM and log in to its guest OS.
    2. Navigate to the Optional updates page:

      Settings Windows Update Advanced options Optional updates

    3. Install all updates from Red Hat, Inc.
  • On operating systems prior to Windows 10 and Windows Server 2016, or if the OS does not have access to Windows Update, reinstall the drivers.

    This restores the Windows guest OS network configuration to default (DHCP). If you want to preserve a customized network configuration, you also need to create a backup and restore it by using the netsh utility:

    1. Start the Windows VM and log in to its guest OS.
    2. Open the Windows Command Prompt:

      1. Use the Super+R keyboard shortcut.
      2. In the window that appears, type cmd and press Ctrl+Shift+Enter to run as administrator.
    3. Back up the OS network configuration by using the Windows Command Prompt:

      C:\WINDOWS\system32\netsh dump > backup.txt
    4. Reinstall KVM virtio drivers from the attached installation media. Do one of the following:

      • Reinstall the drivers by using the Windows Command Prompt, where X is the installation media drive letter. The following commands install all virtio drivers.

        • If using a 64-bit vCPU:

          C:\WINDOWS\system32\msiexec.exe /i X:\virtio-win-gt-x64.msi /passive /norestart
        • If using a 32-bit vCPU:

          C:\WINDOWS\system32\msiexec.exe /i X:\virtio-win-gt-x86.msi /passive /norestart
      • Reinstall the drivers using the graphical interface without rebooting the VM.
    5. Restore the OS network configuration using the Windows Command Prompt:

      C:\WINDOWS\system32\netsh -f backup.txt
    6. Reboot the VM to complete the driver installation.
    7. Optional: If you use a centralized update or configuration management system, such as Windows Server Update Services (WSUS), configure the system to allow drivers published by Red Hat, Inc.

      Some enterprise management services require specific vendors or drivers to be added to a trust-list. If Red Hat is not explicitly permitted, the system blocks virtio-win updates.

      +

      Note

      Approving Red Hat driver updates in WSUS is not sufficient. To receive regular driver updates, ensure that your management policy specifically permits the Red Hat vendor.

4.2. Enabling Hyper-V enlightenments

Hyper-V enlightenments provide a method for KVM to emulate the Microsoft Hyper-V hypervisor, which improves the performance of Windows virtual machines.

4.2.1. Enabling Hyper-V enlightenments on a Windows virtual machine

To improve the performance of a Windows virtual machine (VM) running in a RHEL 10 host, you can use Hyper-V enlightenments.

Procedure

  1. Use the virsh edit command to open the XML configuration of the VM. For example:

    # virsh edit windows-vm
  2. Add the following <hyperv> sub-section to the <features> section of the XML:

    <features>
      [...]
      <hyperv>
        <relaxed state='on'/>
        <vapic state='on'/>
        <spinlocks state='on' retries='8191'/>
        <vendor_id state='on' value='KVM Hv'/>
        <vpindex state='on'/>
        <runtime state='on' />
        <synic state='on'/>
        <stimer state='on'>
          <direct state='on'/>
        </stimer>
        <frequencies state='on'/>
        <reset state='on'/>
        <tlbflush state='on'/>
        <reenlightenment state='on'/>
        <ipi state='on'/>
        <evmcs state='on'/>
      </hyperv>
      [...]
    </features>

    If the XML already contains a <hyperv> sub-section, modify it as shown above.

  3. Change the clock section of the configuration as follows:

    <clock offset='localtime'>
      ...
      <timer name='hypervclock' present='yes'/>
    </clock>
  4. Save and exit the XML configuration.
  5. If the VM is running, restart it.

Verification

  • Use the virsh dumpxml command to display the XML configuration of the running VM. If it includes the following segments, the Hyper-V enlightenments are enabled on the VM.

    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vendor_id state='on' value='KVM Hv'/>
      <vpindex state='on'/>
      <runtime state='on' />
      <synic state='on'/>
      <frequencies state='on'/>
      <reset state='on'/>
      <tlbflush state='on'/>
      <reenlightenment state='on'/>
      <stimer state='on'>
        <direct state='on'/>
      </stimer>
      <ipi state='on'/>
      <evmcs state='on'/>
    </hyperv>
    
    <clock offset='localtime'>
      ...
      <timer name='hypervclock' present='yes'/>
    </clock>

4.2.2. Configurable Hyper-V enlightenments

You can configure certain Hyper-V features to optimize Windows VMs. For details on the configurable Hyper-V features and their values, see the following table.

Expand
Table 4.1. Configurable Hyper-V features
EnlightenmentDescriptionValues

evmcs

Implements paravirtualized protocol between L0 (KVM) and L1 (Hyper-V) hypervisors, which enables faster L2 exits to the hypervisor.

Note

This feature is exclusive to Intel processors.

on, off

frequencies

Enables Hyper-V frequency Machine Specific Registers (MSRs).

on, off

ipi

Enables paravirtualized inter processor interrupts (IPI) support.

on, off

reenlightenment

Notifies when there is a time stamp counter (TSC) frequency change which only occurs during migration. It also allows the guest to keep using the old frequency until it is ready to switch to the new one.

on, off

relaxed

Disables a Windows sanity check that commonly results in a BSOD when the VM is running on a heavily loaded host. This is similar to the Linux kernel option no_timer_check, which is automatically enabled when Linux is running on KVM.

on, off

runtime

Sets processor time spent on running the guest code, and on behalf of the guest code.

on, off

spinlocks

  • Used by a VM’s operating system to notify Hyper-V that the calling virtual processor is attempting to acquire a resource that is potentially held by another virtual processor within the same partition.
  • Used by Hyper-V to indicate to the virtual machine’s operating system the number of times a spinlock acquisition should be attempted before indicating an excessive spin situation to Hyper-V.

on, off

stimer

Enables synthetic timers for virtual processors. Note that certain Windows versions revert to using HPET (or even RTC when HPET is unavailable) when this enlightenment is not provided, which can lead to significant CPU consumption, even when the virtual CPU is idle.

on, off

stimer-direct

Enables synthetic timers when an expiration event is delivered through a normal interrupt.

on, off.

synic

Together with stimer, activates the synthetic timer. Windows 8 uses this feature in periodic mode.

on, off

time

Enables the following Hyper-V-specific clock sources available to the VM,

  • MSR-based 82 Hyper-V clock source (HV_X64_MSR_TIME_REF_COUNT, 0x40000020)
  • Reference TSC 83 page which is enabled through MSR (HV_X64_MSR_REFERENCE_TSC, 0x40000021)

on, off

tlbflush

Flushes the TLB of the virtual processors.

on, off

vapic

Enables virtual APIC, which provides accelerated MSR access to the high-usage, memory-mapped Advanced Programmable Interrupt Controller (APIC) registers.

on, off

vendor_id

Sets the Hyper-V vendor id.

  • on, off
  • Id value - string of up to 12 characters

vpindex

Enables virtual processor index.

on, off

4.3. Configuring NetKVM driver parameters

After the NetKVM driver is installed, you can configure it to better suit your environment. You can configure the driver parameters by using the Windows Device Manager (devmgmt.msc).

Important

Modifying the driver’s parameters causes Windows to reload that driver. This interrupts existing network activity.

Prerequisites

Procedure

  1. In the Windows guest operating system, open the Windows Device Manager application.
  2. Locate the Red Hat VirtIO Ethernet Adapter.

    1. In the Device Manager window, click + next to Network adapters.
    2. Under the list of network adapters, double-click Red Hat VirtIO Ethernet Adapter.

      The Properties window for the device opens.

  3. View the device parameters.

    In the Properties window, click the Advanced tab.

  4. Modify the device parameters.

    1. Click the parameter you want to modify.

      Options for that parameter are displayed.

    2. Modify the options as needed.

      For information about the NetKVM parameter options, refer to NetKVM driver parameters.

    3. Click OK to save the changes.

4.4. NetKVM driver parameters

When configuring NetKVM drivers to optimize your Windows guest operating system, adjusting the individual parameters can significantly change how the virtual machine works.

For details on the configurable NetKVM driver logging parameters, see the following table.

Expand
Table 4.2. Logging parameters
ParameterDescription 2

Logging.Enable

A Boolean value that determines whether logging is enabled. The default value is Enabled.

Logging.Level

An integer that defines the logging level. As the integer increases, so does the verbosity of the log.

  • The default value is 0 (errors only).
  • 1-2 adds configuration messages.
  • 3-4 adds packet flow information.
  • 5-6 adds interrupt and DPC level trace information.
Note

High logging levels will slow down your virtual machine.

For details on the configurable NetKVM driver initial parameters, see the following table.

Expand
Table 4.3. Initial parameters
ParameterDescription

Assign MAC

A string that defines the locally-administered MAC address for the paravirtualized NIC. This is not set by default.

Init.Do802.1PQ

A Boolean value that enables Priority/VLAN tag population and removal support. The default value is Enabled.

Init.MaxTxBuffers

An integer that represents the number of TX ring descriptors that will be allocated. The value is limited by the size of Tx queue of QEMU.

The default value is 1024.

Valid values are: 16, 32, 64, 128, 256, 512, and 1024.

Init.MaxRxBuffers

An integer that represents the number of RX ring descriptors that will be allocated. The value is limited by the size of Tx queue of QEMU.

The default value is 1024.

Valid values are: 16, 32, 64, 128, 256, 512, 1024, 2048, and 4096.

Offload.Tx.Checksum

Specifies the TX checksum offloading capability.

In Red Hat Enterprise Linux 10, the valid values for this parameter are:

  • All (the default) which enables IP, TCP, and UDP checksum offloading for both IPv4 and IPv6
  • TCP/UDP(v4,v6) which enables TCP and UDP checksum offloading for both IPv4 and IPv6
  • TCP/UDP(v4) which enables TCP and UDP checksum offloading for IPv4 only
  • TCP(v4) which enables only TCP checksum offloading for IPv4 only

Offload.Rx.Checksum

Specifies the RX checksum offloading capability.

In Red Hat Enterprise Linux 10, the valid values for this parameter are:

  • All (the default) which enables IP, TCP, and UDP checksum offloading for both IPv4 and IPv6
  • TCP/UDP(v4,v6) which enables TCP and UDP checksum offloading for both IPv4 and IPv6
  • TCP/UDP(v4) which enables TCP and UDP checksum offloading for IPv4 only
  • TCP(v4) which enables only TCP checksum offloading for IPv4 only

Offload.Tx.LSO

Specifies the TX large segments offloading (LSO) capability.

In Red Hat Enterprise Linux 10, the valid values for this parameter are:

  • Maximal (the default) which enables LSO offloading for both TCPv4 and TCPv6
  • IPv4 which enables LSO offloading for TCPv4 only
  • Disable which disables LSO offloading

MinRxBufferPercent

Specifies minimal amount of available buffers in RX queue in percent of total amount of RX buffers. If the actual number of available buffers is lower than that value, the NetKVM driver indicates low resources condition to the operating system (requesting it to return the RX buffers as soon as possible)

Minimum value (default) - 0, meaning the driver never indicates low resources condition.

Maximum value - 100, meaning the driver indicates low resources condition all the time.

4.5. Optimizing background processes on Windows virtual machines

To optimize the performance of a virtual machine (VM) running a Windows OS, you can configure or disable a variety of Windows processes. To do so, perform any combination of the following measures.

Warning

Certain processes might not work as expected if you change their configuration.

Procedure

  • Remove unused devices, such as USBs or CD-ROMs, and disable the ports.
  • Disable background services, such as SuperFetch and Windows Search. For more information about stopping services, see Disabling system services or Stop-Service.

    • Disable useplatformclock. To do so, run the following command:

      # bcdedit /set useplatformclock No
  • Review and disable unnecessary scheduled tasks, such as scheduled disk defragmentation. For more information about how to do so, see Disable Scheduled Tasks.
  • Make sure the disks are not encrypted.
  • Reduce periodic activity of server applications. You can do so by editing the respective timers. For more information, see Multimedia Timers.
  • Close the Server Manager application on the VM.
  • Disable the antivirus software. Note that disabling the antivirus might compromise the security of the VM.
  • Disable the screen saver.
  • Keep the Windows OS on the sign-in screen when not in use.
Red Hat logoGithubredditYoutubeTwitter

Formazione

Prova, acquista e vendi

Community

Informazioni sulla documentazione di Red Hat

Aiutiamo gli utenti Red Hat a innovarsi e raggiungere i propri obiettivi con i nostri prodotti e servizi grazie a contenuti di cui possono fidarsi. Esplora i nostri ultimi aggiornamenti.

Rendiamo l’open source più inclusivo

Red Hat si impegna a sostituire il linguaggio problematico nel codice, nella documentazione e nelle proprietà web. Per maggiori dettagli, visita il Blog di Red Hat.

Informazioni su Red Hat

Forniamo soluzioni consolidate che rendono più semplice per le aziende lavorare su piattaforme e ambienti diversi, dal datacenter centrale all'edge della rete.

Theme

© 2026 Red Hat
Torna in cima