Привет всем! Сейчас тестирую, как можно получить максимальную производительность диска (IOPS) внутри VM. Заметил, что есть жесткий предел внутри VM, например, ~120K случайной записи (с VirtIO SCSI одноконтроллером) и ~170K случайной записи (с VirtIO block). Более точные значения перечислены ниже. Также удалось сузить причину до ограничения потока ввода-вывода, поскольку все процессы ввода-вывода работают в одном потоке, и это нельзя расширить стандартными параметрами Qemu. Это означает, что максимальная скорость масштабируется с тактовой частотой одного ядра, в данный момент она составляет 100%. Обычно вы должны иметь возможность определить несколько потоков ввода-вывода и очередей для устройств VirtIO block, как описано здесь: [ >). Вопрос теперь в том, будет ли эта опция скоро включена в Proxmox? Если вы определяете необходимые параметры через пользовательские параметры в VM.conf (args), вы получаете только сообщение об ошибке: “Свойство ‘virtio-blk-pci.num_queues’ не найдено”. Это было бы огромным приростом в производительности, поскольку вы почти достигаете скорости работы нативно, в зависимости от количества назначенных потоков и дополнительного закрепления CPU. Стоит отметить, что я также проводил те же тесты с автономным NVMe с форматированием ext4, чтобы исключить файловую систему ZFS как первопричину. Скорость на хосте была немного быстрее в некоторых аспектах, но ограничение внутри VM было тем же.
Хост:
Конфигурация хранилища: ZFS vDev Mirror (Raid10): 4x Kioxia CD8P-R SIE (7.68TB)
Результаты тестирования:
На хосте ZFS: Compression=lz4, ARC=all, Dedup=off, ashift=12, atime=off, recordsize=16K
Test Name | IOPS | MB/s
------- | -------- | --------
randread | 1425k | 5838 MB/s
randwrite | 284k | 1162 MB/s
seqread | 2121k | 8687 MB/s
seqwrite | 497k | 2035 MB/s
Код:
RND Write:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randwrite --numjobs=16 --ramp_time=10 --runtime=60 --rw=randwrite --size=256M --time_based --directory=/vdev-mirror/FIO/`
RND Read:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randread --numjobs=16 --ramp_time=10 --runtime=60 --rw=randread --size=256M --time_based --directory=/vdev-mirror/FIO/`
SEQ Write:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=seqwrite --numjobs=16 --ramp_time=10 --runtime=60 --rw=write --size=256M --time_based --directory=/vdev-mirror/FIO/`
SEQ Read:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=seqread --numjobs=16 --ramp_time=10 --runtime=60 --rw=read --size=256M --time_based --directory=/vdev-mirror/FIO/`
Внутри VM:
Конфигурация VM:
* 32x vCPU
* Тип CPU хоста
* 32GB RAM
* iothread=true
* discard=true
* Сырой диск на ZFS vdev mirror
Чтобы сделать сообщение короче, я просто прикреплю тест randread для обоих типов контроллера хранилища.
С контроллером VirtIO SCSI:
Код:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randread --numjobs=16 --ramp_time=10 --runtime=60 --rw=randread --size=256M --time_based --directory=/home/FIO/`
randread: (g=0): rw=randread, bs=® 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
...
fio-3.33
Starting 16 processes
Jobs: 16 (f=16): [r(16)][100.0%][r=653MiB/s][r=167k IOPS][eta 00m:00s]
randread: (groupid=0, jobs=16): err= 0: pid=979: Wed Mar 19 14:34:50 2025
read: IOPS=169k, BW=659MiB/s (691MB/s)(38.6GiB/60008msec)
bw ( KiB/s): min=667121, max=790884, per=100.00%, avg=675333.80, stdev=1131.55, samples=1916
iops : min=166778, max=197718, avg=168831.60, stdev=282.89, samples=1916
cpu : usr=0.68%, sys=2.02%, ctx=321241, majf=0, minf=587
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 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=10124405,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Внутри VM на Ubuntu Host с установкой QEMU/KVM и двумя iothreads: Чем больше iothreads вы назначаете контроллеру VirtIO block, тем быстрее/лучше производительность внутри VM.
Код:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randread --numjobs=16 --ramp_time=10 --runtime=60 --rw=randread --size=256M --time_based --directory=/home/FIO/`
randread: IOPS=630k, BW=2460MiB/s (2579MB/s)(144GiB/60003msec)
Хост:

Конфигурация хранилища: ZFS vDev Mirror (Raid10): 4x Kioxia CD8P-R SIE (7.68TB)
Результаты тестирования:
На хосте ZFS: Compression=lz4, ARC=all, Dedup=off, ashift=12, atime=off, recordsize=16K
Test Name | IOPS | MB/s
------- | -------- | --------
randread | 1425k | 5838 MB/s
randwrite | 284k | 1162 MB/s
seqread | 2121k | 8687 MB/s
seqwrite | 497k | 2035 MB/s
Код:
RND Write:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randwrite --numjobs=16 --ramp_time=10 --runtime=60 --rw=randwrite --size=256M --time_based --directory=/vdev-mirror/FIO/`
RND Read:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randread --numjobs=16 --ramp_time=10 --runtime=60 --rw=randread --size=256M --time_based --directory=/vdev-mirror/FIO/`
SEQ Write:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=seqwrite --numjobs=16 --ramp_time=10 --runtime=60 --rw=write --size=256M --time_based --directory=/vdev-mirror/FIO/`
SEQ Read:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=seqread --numjobs=16 --ramp_time=10 --runtime=60 --rw=read --size=256M --time_based --directory=/vdev-mirror/FIO/`
Внутри VM:
Конфигурация VM:
* 32x vCPU
* Тип CPU хоста
* 32GB RAM
* iothread=true
* discard=true
* Сырой диск на ZFS vdev mirror
Чтобы сделать сообщение короче, я просто прикреплю тест randread для обоих типов контроллера хранилища.
С контроллером VirtIO SCSI:
Код:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randread --numjobs=16 --ramp_time=10 --runtime=60 --rw=randread --size=256M --time_based --directory=/home/FIO/`
randread: (g=0): rw=randread, bs=® 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
...
fio-3.33
Starting 16 processes
Jobs: 16 (f=16): [r(16)][100.0%][r=653MiB/s][r=167k IOPS][eta 00m:00s]
randread: (groupid=0, jobs=16): err= 0: pid=979: Wed Mar 19 14:34:50 2025
read: IOPS=169k, BW=659MiB/s (691MB/s)(38.6GiB/60008msec)
bw ( KiB/s): min=667121, max=790884, per=100.00%, avg=675333.80, stdev=1131.55, samples=1916
iops : min=166778, max=197718, avg=168831.60, stdev=282.89, samples=1916
cpu : usr=0.68%, sys=2.02%, ctx=321241, majf=0, minf=587
IO depths : 1=0.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 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=10124405,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Внутри VM на Ubuntu Host с установкой QEMU/KVM и двумя iothreads: Чем больше iothreads вы назначаете контроллеру VirtIO block, тем быстрее/лучше производительность внутри VM.
Код:
`fio --bs=4k --direct=1 --gtod_reduce=1 --ioengine=libaio --iodepth=32 --group_reporting --name=randread --numjobs=16 --ramp_time=10 --runtime=60 --rw=randread --size=256M --time_based --directory=/home/FIO/`
randread: IOPS=630k, BW=2460MiB/s (2579MB/s)(144GiB/60003msec)
