Бенчмаркил и настраивал новую установку Proxmox на ZFS, и получил странные результаты синхронных записей из VM, что мне трудно объяснить. Я тестирую стек хранения от физических дисков до zvol изнутри VM. Вот команда fio, которую я использую:
```
fio --filename=/dev/sda --ioengine=libaio --loops=1 --size=10G --time_based --runtime=60 --group_reporting --stonewall --name=cc1 --description="CC1" --rw=write --bs=4k --direct=1 --iodepth=1 --numjobs=1 --sync=1
```
По сути, я тестирую блочные устройства для случайных записей при 4k/QD1, и важная часть — ' --sync=1', т.е. это должно делать синхронные записи, которые должны быть медленными. Однако, эти записи, когда они выполняются изнутри VM, чрезмерно быстрые! Хотя можно поспорить, что это хорошая проблема, это указывает на то, что, несмотря на то, что приложение в VM запрашивает синхронные записи, это не происходит, поэтому согласованность потенциально скомпрометирована. Или я просто не совсем понимаю, что происходит.
Итак, вот детали. У меня есть 2 SSD-диска (host:/dev/sda и host:/dev/sdb), два раздела на этих дисках, объединенные в зеркальный пул ZFS 'ztest', и ztest имеет zvol /dev/zd0 = 'vm-101-disk-0', который может быть передан непосредственно на хост, и может быть передан в VM (Debian Live), которая может запускать fio на нем в гостевой среде (guest:/dev/sda).
Чтобы установить базовые показатели, я запускаю команду fio выше на необработанном физическом дисковом разделе (host:/dev/sdb5) и получаю следующие IOPS (округлены для удобства чтения):
host, sdb5, sync=0 15,000
host, sdb5, sync=1 1,000
Это показывает, чего эти диски способны при синхронной и асинхронной нагрузке в соответствии с вышеизложенным. Это тестовые диски, поэтому IOPS ужасны, но также легко заметить различия.
Если я запускаю ту же нагрузку все еще на хосте, но против /dev/zd0 и с разными настройками атрибута sync на zvol:
host, zd0/standard, sync=0 17,000
host, zd0/standard, sync=1 700
host, zd0/always, sync=0 700
host, zd0/always, sync=1 700
Здесь нет ничего особенно необычного - стандартный sync уважает явные синхронизации и не делает синхронно, когда не запрашивается, а always sync всегда делает синхронно, независимо от того, что. Единственное, что меня удивило, так это то, что синхронные записи на zvol оказались заметно медленнее, чем синхронные записи на самый медленный базовый диск, и это происходит гораздо чаще (я повторно тестировал несколько раз, это стабильно). Ожидаемо ли это, и что может быть причиной этого?
Но результаты становятся действительно странными, когда я тестирую тот же самый zvol изнутри VM:
guest, sda/standard, sync=0, cache=none 20,000
guest, sda/standard, sync=1, cache=none 10,000
guest, sda/standard, sync=0, cache=directsync 15,000
guest, sda/standard, sync=1, cache=directsync 15,000
guest, sda/always, sync=0, cache=none 700
guest, sda/always, sync=1, cache=none 700
Ладно, эта таблица совершенно мне непонятна (ну, кроме последних двух строк, я думаю). Итак, при cache=none я ожидал, что гостевой zvol будет вести себя так же, как при тестировании на хосте, но даже при sync=1 очевидно, что записи не совсем синхронные, они слишком быстрые. Хуже того, между sync=0 и sync=1 есть разница в этом случае, и обе они намного выше, чем физические синхронные записи. Хуже того, эти результаты (для cache=none) по сути те же, что и для cache=writeback (wtf?!). Даже хуже, режим Directsync также создает разницу, но он тоже слишком быстрый (и теперь sync=0 не отличается от sync=1). И в заключение, чтобы убедиться, что я не тестирую не тот диск или что-то подобное ( ), как только я установил sync=always на оригинальный zvol, гостевой наконец-то показывает ожидаемо ужасные IOPS независимо от того, что настроено для sync в fio.
Так, что происходит? Чувствую, что что-то упускаю...
P.S. Я попробовал другие комбинации cache, io_uring/native и т.д., эти другие настройки не оказывали существенного влияния. SCSI single с IOTreads включены.
```
fio --filename=/dev/sda --ioengine=libaio --loops=1 --size=10G --time_based --runtime=60 --group_reporting --stonewall --name=cc1 --description="CC1" --rw=write --bs=4k --direct=1 --iodepth=1 --numjobs=1 --sync=1
```
По сути, я тестирую блочные устройства для случайных записей при 4k/QD1, и важная часть — ' --sync=1', т.е. это должно делать синхронные записи, которые должны быть медленными. Однако, эти записи, когда они выполняются изнутри VM, чрезмерно быстрые! Хотя можно поспорить, что это хорошая проблема, это указывает на то, что, несмотря на то, что приложение в VM запрашивает синхронные записи, это не происходит, поэтому согласованность потенциально скомпрометирована. Или я просто не совсем понимаю, что происходит.
Итак, вот детали. У меня есть 2 SSD-диска (host:/dev/sda и host:/dev/sdb), два раздела на этих дисках, объединенные в зеркальный пул ZFS 'ztest', и ztest имеет zvol /dev/zd0 = 'vm-101-disk-0', который может быть передан непосредственно на хост, и может быть передан в VM (Debian Live), которая может запускать fio на нем в гостевой среде (guest:/dev/sda).
Чтобы установить базовые показатели, я запускаю команду fio выше на необработанном физическом дисковом разделе (host:/dev/sdb5) и получаю следующие IOPS (округлены для удобства чтения):
host, sdb5, sync=0 15,000
host, sdb5, sync=1 1,000
Это показывает, чего эти диски способны при синхронной и асинхронной нагрузке в соответствии с вышеизложенным. Это тестовые диски, поэтому IOPS ужасны, но также легко заметить различия.
Если я запускаю ту же нагрузку все еще на хосте, но против /dev/zd0 и с разными настройками атрибута sync на zvol:
host, zd0/standard, sync=0 17,000
host, zd0/standard, sync=1 700
host, zd0/always, sync=0 700
host, zd0/always, sync=1 700
Здесь нет ничего особенно необычного - стандартный sync уважает явные синхронизации и не делает синхронно, когда не запрашивается, а always sync всегда делает синхронно, независимо от того, что. Единственное, что меня удивило, так это то, что синхронные записи на zvol оказались заметно медленнее, чем синхронные записи на самый медленный базовый диск, и это происходит гораздо чаще (я повторно тестировал несколько раз, это стабильно). Ожидаемо ли это, и что может быть причиной этого?
Но результаты становятся действительно странными, когда я тестирую тот же самый zvol изнутри VM:
guest, sda/standard, sync=0, cache=none 20,000
guest, sda/standard, sync=1, cache=none 10,000
guest, sda/standard, sync=0, cache=directsync 15,000
guest, sda/standard, sync=1, cache=directsync 15,000
guest, sda/always, sync=0, cache=none 700
guest, sda/always, sync=1, cache=none 700
Ладно, эта таблица совершенно мне непонятна (ну, кроме последних двух строк, я думаю). Итак, при cache=none я ожидал, что гостевой zvol будет вести себя так же, как при тестировании на хосте, но даже при sync=1 очевидно, что записи не совсем синхронные, они слишком быстрые. Хуже того, между sync=0 и sync=1 есть разница в этом случае, и обе они намного выше, чем физические синхронные записи. Хуже того, эти результаты (для cache=none) по сути те же, что и для cache=writeback (wtf?!). Даже хуже, режим Directsync также создает разницу, но он тоже слишком быстрый (и теперь sync=0 не отличается от sync=1). И в заключение, чтобы убедиться, что я не тестирую не тот диск или что-то подобное ( ), как только я установил sync=always на оригинальный zvol, гостевой наконец-то показывает ожидаемо ужасные IOPS независимо от того, что настроено для sync в fio.
Так, что происходит? Чувствую, что что-то упускаю...
P.S. Я попробовал другие комбинации cache, io_uring/native и т.д., эти другие настройки не оказывали существенного влияния. SCSI single с IOTreads включены.
