Windows VM very slow disk access on passthrough device

I have a Windows server VM running on top of Ubuntu, and it was sorta fine for a while but lately it’s been really, really slow and I don’t understand why. It seems to be related to slow disk access speeds, but it gets a block device passthrough to it’s own SSD so I don’t know why

$ fastfetch
                             ....              redacted@redacted
              .',:clooo:  .:looooo:.           --------------
           .;looooooooc  .oooooooooo'          OS: Ubuntu 24.04.3 LTS x86_64
        .;looooool:,''.  :ooooooooooc          Host: X99-D3
       ;looool;.         'oooooooooo,          Kernel: Linux 6.8.0-79-generic
      ;clool'             .cooooooc.  ,,       Uptime: 2 days, 21 hours
         ...                ......  .:oo,      Packages: 865 (dpkg)
  .;clol:,.                        .loooo'     Shell: bash 5.2.21
 :ooooooooo,                        'ooool     Terminal: /dev/pts/1
'ooooooooooo.                        loooo.    CPU: Intel(R) Xeon(R) E5-2696 v3 (36) @ 3.80 GHz
'ooooooooool                         coooo.    GPU 1: NVIDIA Quadro K6000 [Discrete]
 ,loooooooc.                        .loooo.    GPU 2: Intel Arc A310 @ 2.45 GHz [Discrete]
   .,;;;'.                          ;ooooc     Memory: 50.91 GiB / 125.69 GiB (41%)
       ...                         ,ooool.     Swap: 0 B / 8.00 GiB (0%)
    .cooooc.              ..',,'.  .cooo.      Disk (/): 143.53 GiB / 456.35 GiB (31%) - ext4
      ;ooooo:.           ;oooooooc.  :l.       Disk (/mnt/dsk/1): 9.25 TiB / 12.63 TiB (73%) - ext4
       .coooooc,..      coooooooooo.           Disk (/mnt/dsk/2): 9.53 TiB / 12.63 TiB (75%) - ext4
         .:ooooooolc:. .ooooooooooo'           Disk (/mnt/dsk/3): 9.01 TiB / 12.63 TiB (71%) - ext4
           .':loooooo;  ,oooooooooc            Disk (/mnt/dsk/4): 9.45 TiB / 12.63 TiB (75%) - ext4
               ..';::c'  .;loooo:'             Disk (/mnt/dsk/5): 10.64 TiB / 14.44 TiB (74%) - ext4
                                               Disk (/mnt/dsk/6): 10.59 TiB / 14.44 TiB (73%) - ext4
                                               Disk (/mnt/etc): 17.86 GiB / 931.06 GiB (2%) - xfs
                                               Disk (/mnt/wrk): 29.31 GiB / 953.40 GiB (3%) - xfs
                                               Local IP (bridge0): 192.168.0.2/24
                                               Locale: C.UTF-8

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0  12.7T  0 disk /mnt/dsk/1
sdb           8:16   0  12.7T  0 disk /mnt/dsk/3
sdc           8:32   0  14.6T  0 disk 
└─sdc1        8:33   0  14.6T  0 part /mnt/dsk/5
sdd           8:48   0  14.6T  0 disk 
└─sdd1        8:49   0  14.6T  0 part /mnt/dsk/6
sde           8:64   0  12.7T  0 disk /mnt/dsk/4
sdf           8:80   0  12.7T  0 disk /mnt/dsk/2
sdg           8:96   0 223.6G  0 disk 
├─sdg1        8:97   0   100M  0 part 
├─sdg2        8:98   0    16M  0 part 
├─sdg3        8:99   0   223G  0 part 
└─sdg4        8:100  0   509M  0 part 
sdh           8:112  0 931.5G  0 disk 
└─sdh1        8:113  0 931.5G  0 part /mnt/etc
sr0          11:0    1  1024M  0 rom  
nvme0n1     259:0    0 953.9G  0 disk /mnt/wrk
nvme1n1     259:1    0 465.8G  0 disk 
├─nvme1n1p1 259:2    0     1G  0 part /boot/efi
└─nvme1n1p2 259:3    0 464.7G  0 part /

$ sudo smartctl -a /dev/sdg
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-79-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     Patriot Burst Elite 240GB
Serial Number:    PBENIBB24072139593
LU WWN Device Id: 5 3a5a27 030090001
Firmware Version: HT3618C4
User Capacity:    240,057,409,536 bytes [240 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Form Factor:      2.5 inches
TRIM Command:     Available
Device is:        Not in smartctl database 7.3/5528
ATA Version is:   ACS-4 T13/BSR INCITS 529 revision 5
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Mon Sep  1 01:15:09 2025 UTC
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x00)	Offline data collection activity
					was never started.
					Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0)	The previous self-test routine completed
					without error or no self-test has ever 
					been run.
Total time to complete Offline 
data collection: 		(  120) seconds.
Offline data collection
capabilities: 			 (0x5d) SMART execute Offline immediate.
					No Auto Offline data collection support.
					Abort Offline collection upon new
					command.
					Offline surface scan supported.
					Self-test supported.
					No Conveyance Self-test supported.
					Selective Self-test supported.
SMART capabilities:            (0x0002)	Does not save SMART data before
					entering power-saving mode.
					Supports SMART auto save timer.
Error logging capability:        (0x01)	Error logging supported.
					General Purpose Logging supported.
Short self-test routine 
recommended polling time: 	 (   4) minutes.
Extended self-test routine
recommended polling time: 	 (   8) minutes.

SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x0032   100   100   050    Old_age   Always       -       0
  5 Reallocated_Sector_Ct   0x0032   100   100   050    Old_age   Always       -       0
  9 Power_On_Hours          0x0032   100   100   050    Old_age   Always       -       5036
 12 Power_Cycle_Count       0x0032   100   100   050    Old_age   Always       -       32
160 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       0
161 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       7510
163 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       130
164 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       25
165 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       30
166 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       7
167 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       18
168 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       0
169 Unknown_Attribute       0x0032   100   100   050    Old_age   Always       -       100
175 Program_Fail_Count_Chip 0x0032   100   100   050    Old_age   Always       -       285212672
176 Erase_Fail_Count_Chip   0x0032   100   100   050    Old_age   Always       -       43594
177 Wear_Leveling_Count     0x0032   100   100   050    Old_age   Always       -       623168
178 Used_Rsvd_Blk_Cnt_Chip  0x0032   100   100   050    Old_age   Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   050    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   050    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   100   100   050    Old_age   Always       -       6
194 Temperature_Celsius     0x0032   100   100   050    Old_age   Always       -       41
195 Hardware_ECC_Recovered  0x0032   100   100   050    Old_age   Always       -       184660
196 Reallocated_Event_Count 0x0032   100   100   050    Old_age   Always       -       44608 (0 1)
197 Current_Pending_Sector  0x0032   100   100   050    Old_age   Always       -       29
198 Offline_Uncorrectable   0x0032   100   100   050    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x0032   100   100   050    Old_age   Always       -       0
232 Available_Reservd_Space 0x0032   100   100   050    Old_age   Always       -       86
241 Total_LBAs_Written      0x0032   100   100   050    Old_age   Always       -       41758
242 Total_LBAs_Read         0x0032   100   100   050    Old_age   Always       -       23478

SMART Error Log Version: 0
No Errors Logged

SMART Self-test log structure revision number 0
Warning: ATA Specification requires self-test log structure revision number = 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 0
Note: revision number not 1 implies that no selective self-test has ever been run
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

The above only provides legacy SMART information - try 'smartctl -x' for more

<domain type="kvm">
  <name>Workhorse</name>
  <uuid>ea8d5a86-230b-40af-ae8a-8def52dc1040</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://microsoft.com/win/11"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit="KiB">41943040</memory>
  <currentMemory unit="KiB">41943040</currentMemory>
  <memoryBacking>
    <source type="memfd"/>
    <access mode="shared"/>
  </memoryBacking>
  <vcpu placement="static">24</vcpu>
  <iothreads>2</iothreads>
  <cputune>
    <emulatorpin cpuset="0,18"/>
    <iothreadpin iothread="2" cpuset="0,18"/>
  </cputune>
  <os firmware="efi">
    <type arch="x86_64" machine="pc-q35-8.2">hvm</type>
    <firmware>
      <feature enabled="yes" name="enrolled-keys"/>
      <feature enabled="yes" name="secure-boot"/>
    </firmware>
    <loader readonly="yes" secure="yes" type="pflash">/usr/share/OVMF/OVMF_CODE_4M.ms.fd</loader>
    <nvram template="/usr/share/OVMF/OVMF_VARS_4M.ms.fd">/var/lib/libvirt/qemu/nvram/Workhorse_VARS.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv mode="custom">
      <relaxed state="on"/>
      <vapic state="on"/>
      <spinlocks state="on" retries="8191"/>
      <vpindex state="on"/>
      <synic state="on"/>
      <stimer state="on">
        <direct state="on"/>
      </stimer>
      <reset state="on"/>
      <frequencies state="on"/>
      <reenlightenment state="on"/>
      <tlbflush state="on"/>
      <ipi state="on"/>
    </hyperv>
    <vmport state="off"/>
    <smm state="on"/>
  </features>
  <cpu mode="host-passthrough" check="none" migratable="on">
    <topology sockets="1" dies="1" cores="12" threads="2"/>
  </cpu>
  <clock offset="localtime">
    <timer name="hypervclock" present="yes"/>
    <timer name="rtc" tickpolicy="catchup" track="guest"/>
    <timer name="pit" tickpolicy="delay"/>
    <timer name="hpet" present="no"/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled="no"/>
    <suspend-to-disk enabled="no"/>
  </pm>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type="block" device="disk">
      <driver name="qemu" type="raw" cache="none" io="native" iothread="1"/>
      <source dev="/dev/disk/by-id/ata-Patriot_Burst_Elite_240GB_PBENIBB24072139593"/>
      <target dev="vdb" bus="virtio"/>
      <boot order="2"/>
      <address type="pci" domain="0x0000" bus="0x05" slot="0x00" function="0x0"/>
    </disk>
    <disk type="file" device="cdrom">
      <driver name="qemu" type="raw"/>
      <target dev="sdb" bus="sata"/>
      <readonly/>
      <address type="drive" controller="0" bus="0" target="0" unit="1"/>
    </disk>
    <controller type="usb" index="0" model="qemu-xhci" ports="15">
      <address type="pci" domain="0x0000" bus="0x02" slot="0x00" function="0x0"/>
    </controller>
    <controller type="pci" index="0" model="pcie-root"/>
    <controller type="pci" index="1" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="1" port="0x10"/>
      <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"/>
      <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"/>
      <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"/>
      <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"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x4"/>
    </controller>
    <controller type="pci" index="6" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="6" port="0x15"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x5"/>
    </controller>
    <controller type="pci" index="7" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="7" port="0x16"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x6"/>
    </controller>
    <controller type="pci" index="8" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="8" port="0x17"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x02" function="0x7"/>
    </controller>
    <controller type="pci" index="9" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="9" port="0x18"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x0" multifunction="on"/>
    </controller>
    <controller type="pci" index="10" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="10" port="0x19"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x1"/>
    </controller>
    <controller type="pci" index="11" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="11" port="0x1a"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x2"/>
    </controller>
    <controller type="pci" index="12" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="12" port="0x1b"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x3"/>
    </controller>
    <controller type="pci" index="13" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="13" port="0x1c"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x4"/>
    </controller>
    <controller type="pci" index="14" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="14" port="0x1d"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x5"/>
    </controller>
    <controller type="pci" index="15" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="15" port="0x1e"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x6"/>
    </controller>
    <controller type="pci" index="16" model="pcie-root-port">
      <model name="pcie-root-port"/>
      <target chassis="16" port="0x1f"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x03" function="0x7"/>
    </controller>
    <controller type="sata" index="0">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1f" function="0x2"/>
    </controller>
    <controller type="virtio-serial" index="0">
      <address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
    </controller>
    <filesystem type="mount" accessmode="passthrough">
      <driver type="virtiofs"/>
      <source dir="/mnt/pool/shared/"/>
      <target dir="shared"/>
      <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
    </filesystem>
    <interface type="bridge">
      <mac address="52:54:00:95:60:02"/>
      <source bridge="bridge0"/>
      <model type="e1000e"/>
      <link state="up"/>
      <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
    </interface>
    <serial type="pty">
      <target type="isa-serial" port="0">
        <model name="isa-serial"/>
      </target>
    </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="tablet" bus="usb">
      <address type="usb" bus="0" port="1"/>
    </input>
    <input type="mouse" bus="ps2"/>
    <input type="keyboard" bus="ps2"/>
    <tpm model="tpm-crb">
      <backend type="emulator" version="2.0"/>
    </tpm>
    <graphics type="vnc" port="-1" autoport="yes" listen="127.0.0.1">
      <listen type="address" address="127.0.0.1"/>
    </graphics>
    <graphics type="spice" autoport="yes" listen="::1">
      <listen type="address" address="::1"/>
      <image compression="off"/>
    </graphics>
    <sound model="ich9">
      <address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
    </sound>
    <audio id="1" type="spice"/>
    <video>
      <model type="qxl" ram="65536" vram="65536" vgamem="16384" heads="1" primary="yes"/>
      <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
    </video>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
    </hostdev>
    <hostdev mode="subsystem" type="pci" managed="yes">
      <source>
        <address domain="0x0000" bus="0x07" slot="0x00" function="0x1"/>
      </source>
      <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
    </hostdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="2"/>
    </redirdev>
    <redirdev bus="usb" type="spicevmc">
      <address type="usb" bus="0" port="3"/>
    </redirdev>
    <watchdog model="itco" action="reset"/>
    <memballoon model="virtio">
      <address type="pci" domain="0x0000" bus="0x04" slot="0x00" function="0x0"/>
    </memballoon>
  </devices>
</domain>

edit: i rean hdparm to check the drive itself

$ sudo hdparm -t -T /dev/sdg
/dev/sdg:
 Timing cached reads:     2 MB in 20.51 seconds =  99.87 kB/sec
 Timing buffered disk reads:   2 MB in 17.53 seconds = 116.81 kB/sec

And I compared it to a different drive that I don’t use because it’s unusually slow and problably dying:

$ sudo hdparm -t -T /dev/sdh
/dev/sdh:
 Timing cached reads:   17502 MB in  1.99 seconds = 8785.43 MB/sec
 Timing buffered disk reads: 1204 MB in  3.00 seconds = 400.93 MB/sec

I think I have my answer, but it’s odd because I barely use the VM. It’s like Windows is killing SSDs or something

Theres a bug currently with Windows 11 updates in regards to ssds see here https://www.windowscentral.com/microsoft/windows-11/reports-say-windows-11-update-is-bricking-drives-is-yours-on-the-list

Also if your using a virtual machine only thing I can suggest is installing the guest additions if your using virtualbox.

I thought that was it, but that bug outright kills SSDs to the point that the system can no longer recognise them. this drive is just really, really impossibly slow. And i do have the guest utilities, as otherwise Windows would not be able to see virtiofs and therefore wouldn’t even see the drives. I’m going to try installing windows on the other ssd that i think migth be dying and see how well that works, and if it’s better I’ll buy a new ssd.

To quote the article I linked “Reports suggest Windows 11 update KB5063878 is causing some SSDs and HDDs to fail — and in some cases, data is unrecoverable.”

You can always check the S.M.A.R.T drives data to see if its failing or not a great program that I know of on Windows is called Hdtune on Ubuntu use Disk Utility.

"

This topic was automatically closed after 30 days. New replies are no longer allowed.