Langsame 4k Performance in Windows 11 VM

Hier ist mir aufgefallen dass die Latenz Maximum auf 10.5ms gestiegen ist. Dann habe ich in Lexware die Latenz gemessen und auch dort ist sie auf 12-13 ms gestiegen. Dann könnte es doch daran liegen dass die VirtIO Treiber einen Hau weg haben und das Ändern auf 271 im Gerätemanager nicht alle buggy 285 Treiber deaktiviert. Somit sollte ich wohl mal eine Test VM nur mit W11 inkl. Updates und den 271er Treibern installieren und vergleichen.
 
  • Like
Reactions: boisbleu
Jetzt habe ich heute mal eine neue VM mit W11 aufgesetzt RAM etc alles gleich, als CPU den V2-AES und die 271er IO Tools genommen. Die Windows Updates drauf und dann nur und ausschließlich Lexware. Leider ist die Latenz immer noch etwas über 2ms. Windows fühlt sich etwas flüssiger an als auf der anderen Maschine aber es ist ja auch gar nix anderes drauf. Das Lexware würde ich als unbedinbar bezeichnen. Der Wechsel von Warenwirtschaft auf Lohn und Gehalt dauert rd. 10-15 Sekunden. Ich habe das mit der Musterfirma getestet in der ja quasi keine Buchungsdaten drin sind. Die Datenrücksicherung habe ich gar nicht mehr gemacht da keine Besserung zu erwarten ist.

Ich bin völlig ratlos. Die winsat Auswertung liegt in etwa gleich wie bei der bestehenden Maschine.
 
Ist das immer noch RAIDZ1?

Was bekommst du denn auf PVE direkt raus, wenn du PVE benchmarkst?
Sowas in die Richtung:

fio --ioengine=libaio --direct=1 --sync=1 --rw=write --bs=4K --numjobs=1 --iodepth=1 --runtime=60 --time_based --name seq_read --filename=/path to pool
 
@Joe77, die winsat-Ergebnisse mit v3 vs v4 sind praktisch identisch (Random 16K Read 179 vs 192 MB/s) — CPU-Typ und VBS sind damit als Ursache ausgeschlossen. Dass eine einzelne SATA-SSD bei @boisbleu 831 MB/s Random Read liefert und deine drei PM983 NVMe nur 179 MB/s, bestätigt eindeutig das RAIDZ1 als Flaschenhals.

Zum sync=disabled-Test: Dass sich die 4K-Werte dadurch nicht verändert haben, bedeutet dass nicht die sync-Writes der Engpass sind, sondern der generelle RAIDZ1-Overhead bei kleinen Random-I/Os. Damit ist auch ein SLOG-Device hinfällig — das hatte ich als Alternative vorgeschlagen, aber bei diesem Ergebnis bringt es nichts. @Khensu hatte da recht.

Zum Thema Kapazität beim Mirror-Umbau: Dein Lexware-zvol ist 400 GB. Prüf mal den tatsächlichen Verbrauch auf dem Pool:

Code:
zfs list -o name,used,avail -r ZFS-NVMe

Falls dein Gesamtverbrauch unter ~3,5 TB liegt, reicht ein 2-way Mirror aus zwei NVMe. Die dritte NVMe kannst du als separaten Pool für weniger I/O-kritische VMs/Container nutzen — dann brauchst du keine vierte Platte zu kaufen.
 
  • Like
Reactions: Johannes S
Jetzt bin ich mal dazu gekommen fio zu installieren und laufen zu lassen:

Code:
fio --ioengine=libaio --direct=1 --sync=1 --rw=write --bs=4K --numjobs=1 --iodepth=1 --runtime=60 --time_based --name seq_read --filename=/ZFS-NVMe/vm-201-disk-1 --size=8M
seq_read: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
fio-3.33
Starting 1 process
seq_read: Laying out IO file (1 file / 8MiB)
Jobs: 1 (f=1): [W(1)][100.0%][w=25.9MiB/s][w=6625 IOPS][eta 00m:00s]
seq_read: (groupid=0, jobs=1): err= 0: pid=214680: Sat Mar  7 11:01:20 2026
  write: IOPS=6482, BW=25.3MiB/s (26.6MB/s)(1519MiB/60001msec); 0 zone resets
    slat (usec): min=99, max=56769, avg=151.84, stdev=266.71
    clat (nsec): min=403, max=98733, avg=1620.26, stdev=649.16
     lat (usec): min=100, max=56781, avg=153.46, stdev=266.77
    clat percentiles (nsec):
     |  1.00th=[ 1320],  5.00th=[ 1432], 10.00th=[ 1448], 20.00th=[ 1464],
     | 30.00th=[ 1464], 40.00th=[ 1480], 50.00th=[ 1496], 60.00th=[ 1528],
     | 70.00th=[ 1640], 80.00th=[ 1752], 90.00th=[ 1800], 95.00th=[ 1880],
     | 99.00th=[ 2832], 99.50th=[ 3632], 99.90th=[10688], 99.95th=[11840],
     | 99.99th=[16192]
   bw (  KiB/s): min=22824, max=27936, per=100.00%, avg=25940.44, stdev=976.49, samples=119
   iops        : min= 5706, max= 6984, avg=6485.11, stdev=244.12, samples=119
  lat (nsec)   : 500=0.03%, 750=0.14%, 1000=0.47%
  lat (usec)   : 2=95.94%, 4=2.96%, 10=0.25%, 20=0.21%, 50=0.01%
  lat (usec)   : 100=0.01%
  cpu          : usr=1.59%, sys=25.23%, ctx=388974, majf=0, minf=12
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,388954,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=25.3MiB/s (26.6MB/s), 25.3MiB/s-25.3MiB/s (26.6MB/s-26.6MB/s), io=1519MiB (1593MB), run=60001-60001msec

Ich habe da keine Vergleichswerte aber 25MB/s und 6.6k IOPS kommt mir langsam vor.

Bei einer BlockSize von 16k wird es besser aber auch nicht wirklich gut oder?

Code:
fio --ioengine=libaio --direct=1 --sync=1 --rw=write --bs=16K --numjobs=1 --iodepth=1 --runtime=60 --time_based --name seq_read --filename=/ZFS-NVMe/vm-200-disk-1 --size=8M
seq_read: (g=0): rw=write, bs=(R) 16.0KiB-16.0KiB, (W) 16.0KiB-16.0KiB, (T) 16.0KiB-16.0KiB, ioengine=libaio, iodepth=1
fio-3.33
Starting 1 process
Jobs: 1 (f=1): [W(1)][100.0%][w=91.7MiB/s][w=5870 IOPS][eta 00m:00s]
seq_read: (groupid=0, jobs=1): err= 0: pid=218632: Sat Mar  7 11:06:43 2026
  write: IOPS=5799, BW=90.6MiB/s (95.0MB/s)(5437MiB/60001msec); 0 zone resets
    slat (usec): min=99, max=60333, avg=170.03, stdev=254.72
    clat (nsec): min=403, max=68459, avg=1590.90, stdev=665.28
     lat (usec): min=100, max=60337, avg=171.62, stdev=254.78
    clat percentiles (nsec):
     |  1.00th=[ 1320],  5.00th=[ 1432], 10.00th=[ 1432], 20.00th=[ 1448],
     | 30.00th=[ 1464], 40.00th=[ 1464], 50.00th=[ 1480], 60.00th=[ 1496],
     | 70.00th=[ 1544], 80.00th=[ 1720], 90.00th=[ 1784], 95.00th=[ 1848],
     | 99.00th=[ 2416], 99.50th=[ 4128], 99.90th=[10816], 99.95th=[12480],
     | 99.99th=[17792]
   bw (  KiB/s): min=80896, max=97536, per=100.00%, avg=92828.50, stdev=3154.37, samples=119
   iops        : min= 5056, max= 6096, avg=5801.78, stdev=197.15, samples=119
  lat (nsec)   : 500=0.06%, 750=0.14%, 1000=0.32%
  lat (usec)   : 2=97.05%, 4=1.93%, 10=0.32%, 20=0.17%, 50=0.01%
  lat (usec)   : 100=0.01%
  cpu          : usr=1.58%, sys=27.05%, ctx=348383, majf=0, minf=10
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,347993,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=90.6MiB/s (95.0MB/s), 90.6MiB/s-90.6MiB/s (95.0MB/s-95.0MB/s), io=5437MiB (5702MB), run=60001-60001msec

Hier noch die Ausgabe des belegten Speicher:

Code:
zfs list -o name,used,avail -r ZFS-NVMe
NAME                         USED  AVAIL
ZFS-NVMe                    4.25T  2.60T
ZFS-NVMe/subvol-100-disk-0  2.19G  5.81G
ZFS-NVMe/subvol-101-disk-0  13.4G  26.6G
ZFS-NVMe/subvol-102-disk-0  1.58G  18.4G
ZFS-NVMe/subvol-103-disk-0  2.64G  61.4G
ZFS-NVMe/subvol-104-disk-0  1.35G  18.6G
ZFS-NVMe/subvol-105-disk-0  2.08G  7.92G
ZFS-NVMe/vm-200-disk-0      32.5G  2.62T
ZFS-NVMe/vm-201-disk-0         3M  2.60T
ZFS-NVMe/vm-201-disk-1       406G  2.83T
ZFS-NVMe/vm-201-disk-2         6M  2.60T
ZFS-NVMe/vm-202-disk-0         3M  2.60T
ZFS-NVMe/vm-202-disk-1       406G  2.96T
ZFS-NVMe/vm-202-disk-2         6M  2.60T
ZFS-NVMe/vm-203-disk-0      3.37T  3.71T
ZFS-NVMe/vm-204-disk-0      32.5G  2.61T


Dass bei Raid Z1 etwas Leistung verloren geht ist schon klar aber hier fehlen ja nicht 10% oder 20% sondern eine Komplette Größenordung oder?

Gruß Jochen
 
Hi,

weder wenn ich die IOdepth noch die Größe ändere kommen nennenswert andere Ergebnisse raus:

Code:
io --ioengine=libaio --direct=1 --sync=1 --rw=write --bs=4K --numjobs=1 --iodepth=32 --runtime=60 --time_based --name seq_read --file
name=/ZFS-NVMe/vm-200-disk-1 --size=8M
seq_read: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
fio-3.33
Starting 1 process
Jobs: 1 (f=1): [W(1)][100.0%][w=25.8MiB/s][w=6602 IOPS][eta 00m:00s]
seq_read: (groupid=0, jobs=1): err= 0: pid=231302: Sat Mar  7 11:22:48 2026
  write: IOPS=6386, BW=24.9MiB/s (26.2MB/s)(1497MiB/60001msec); 0 zone resets
    slat (usec): min=85, max=56149, avg=154.13, stdev=269.24
    clat (usec): min=4, max=77244, avg=4855.15, stdev=1692.95
     lat (usec): min=158, max=77412, avg=5009.28, stdev=1721.93
    clat percentiles (usec):
     |  1.00th=[ 4424],  5.00th=[ 4555], 10.00th=[ 4555], 20.00th=[ 4621],
     | 30.00th=[ 4686], 40.00th=[ 4686], 50.00th=[ 4752], 60.00th=[ 4752],
     | 70.00th=[ 4817], 80.00th=[ 4883], 90.00th=[ 5145], 95.00th=[ 5407],
     | 99.00th=[ 6194], 99.50th=[ 6587], 99.90th=[13566], 99.95th=[58983],
     | 99.99th=[62653]
   bw (  KiB/s): min=21928, max=27072, per=100.00%, avg=25552.27, stdev=1005.93, samples=119
   iops        : min= 5482, max= 6768, avg=6388.07, stdev=251.48, samples=119
  lat (usec)   : 10=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.14%, 10=99.72%, 20=0.04%, 50=0.02%
  lat (msec)   : 100=0.08%
  cpu          : usr=1.64%, sys=24.90%, ctx=383209, majf=0, minf=12
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,383188,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=24.9MiB/s (26.2MB/s), 24.9MiB/s-24.9MiB/s (26.2MB/s-26.2MB/s), io=1497MiB (1570MB), run=60001-60001msec
Code:
fio --ioengine=libaio --direct=1 --sync=1 --rw=write --bs=4K --numjobs=1 --iodepth=32 --runtime=60 --time_based --name seq_read --filename=/ZFS-NVMe/vm-200-disk-1 --size=1G
seq_read: (g=0): rw=write, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
fio-3.33
Starting 1 process
seq_read: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=1): [W(1)][100.0%][w=25.0MiB/s][w=6409 IOPS][eta 00m:00s]
seq_read: (groupid=0, jobs=1): err= 0: pid=232360: Sat Mar  7 11:24:03 2026
  write: IOPS=6364, BW=24.9MiB/s (26.1MB/s)(1492MiB/60001msec); 0 zone resets
    slat (usec): min=97, max=61224, avg=154.70, stdev=299.58
    clat (usec): min=5, max=82687, avg=4871.90, stdev=1939.14
     lat (usec): min=153, max=82943, avg=5026.61, stdev=1973.31
    clat percentiles (usec):
     |  1.00th=[ 4424],  5.00th=[ 4555], 10.00th=[ 4555], 20.00th=[ 4621],
     | 30.00th=[ 4686], 40.00th=[ 4686], 50.00th=[ 4686], 60.00th=[ 4752],
     | 70.00th=[ 4817], 80.00th=[ 4883], 90.00th=[ 5145], 95.00th=[ 5473],
     | 99.00th=[ 6456], 99.50th=[ 7177], 99.90th=[13566], 99.95th=[67634],
     | 99.99th=[74974]
   bw (  KiB/s): min=21416, max=27416, per=100.00%, avg=25463.60, stdev=1251.27, samples=119
   iops        : min= 5354, max= 6854, avg=6365.90, stdev=312.82, samples=119
  lat (usec)   : 10=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.11%, 10=99.74%, 20=0.05%, 50=0.01%
  lat (msec)   : 100=0.09%
  cpu          : usr=1.62%, sys=25.12%, ctx=382152, majf=0, minf=13
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,381880,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=32

Run status group 0 (all jobs):
  WRITE: bw=24.9MiB/s (26.1MB/s), 24.9MiB/s-24.9MiB/s (26.1MB/s-26.1MB/s), io=1492MiB (1564MB), run=60001-60001msec

Ich scheue mich eine 4. Platte zu kaufen und umzubauen. Von der Theorie her sollte RaidZ1 ja auf die Geschwindigkeit von einer Platte begrenzt sein (minus etwas Overhead). Aber die Werte sind ja weit weg von allem.

Gruß Jochen
 
Der fio-Test hat einen Haken: --sync=1 erzwingt synchrone Writes durch den ZIL, deshalb bringt auch iodepth=32 nix, der ZIL serialisiert das einfach. Deine VM hat aber cache=writeback in der Config, d.h. QEMU bestätigt Writes sofort ohne sync an ZFS. Der fio-Test misst also ein komplett anderes Szenario als das was die VM tatsächlich sieht.
Probier mal das hier, das kommt näher an den realen VM-Workload:
Code:
fio --ioengine=libaio --direct=1 --rw=randwrite --bs=4k --numjobs=1 --iodepth=32 --runtime=60 --time_based --name=randwrite_test --filename=/ZFS-NVMe/vm-200-disk-1 --size=1G
Also ohne --sync=1 und mit --rw=randwrite statt --rw=write. Damit sehen wir was RAIDZ1 bei async random writes wirklich kann.
Bei Mirror hatte ich geschrieben "falls unter 3,5T reicht ein Mirror". Dein zfs list zeigt aber 4,25T used, allein vm-203 frisst 3,37T. Ein 2-way Mirror aus 2 NVMe hätte nur ~3,84T nutzbar, das passt also hinten und vorne nicht. Ohne mindestens eine vierte NVMe (dann 2x 2-way Mirror = ~7,7T nutzbar) wird das mit Mirror nix. Was ist vm-203, kann das ggf. woanders hin?
 
  • Like
Reactions: UdoB