#Вопрос: А правильно ли понимаю: Вот вывод команды: zpool iostat -r 5 https://pastebin.com/raw/af28ZRGF
Что по факту у меня гостевые ОС пишут в большинстве своём 4К и 8К блоками ? При ashift=13 у меня программный размер блока 4К и диски тоже по 4К.
Получается вмместо одного блока 4К записи на диск, при record_size=128K , пишется 128/4=32 блока на диск. Нагрузка на пул больше, НО влияет ли это кол-во записей в special vdev ? По идее же нет, туда пишется инфа про ОДИН 128К сектор, а не 32 раза про 4К сектора ? Т.е. неподходящий размер блока не будет же увеличивать нагрузку на special vdev ? Спасибо
1) у тебя нагрузка не на special vdev идёт, а на SLOG
2) recordsize определяет максимальный размер чтения и записи за раз, округляя до ahift, меньше чем ashift он считать не может.
Т.е. если система хочет считать 129КБ, она считает 128КБ и 128КБ двумя разными запросам. Но, если файлик 2КБ, то ZFS всё равно в итоге будет читать 4КБ, но использовать recordsize < ashift идея нездравая, поэтому мы не будем продолжать про это.
Теперь сложно (это вроде раньше обсуждалось)
Дальше
Чтение проще всего будет описать (ни одной части файла нет в ARC, потому что это ещё один уровень был бы)
Мы хотим прочитать Файл 1024КБ
Для этого ФС ZFS запрашивает 8 блоков по 128КБ у "виртуального диска" ZFS (тут есть умный термин, который я не знаю)
Виртуальный диск делит эти блоки по 128КБ на 32 запроса по 4к
Дальше каждый запрос по 4к бьётся уже самой ОС (при общении с блочным устройством) на блоки по 512
А уже контроллер диска считывает сектор на 4к и смотрит попадают ли туда все наши блоки по 512
Ещё от recordsize зависит размер меты, то есть чем они ниже, тем больше меты нужно (потому что мета идёт на recordsize)
А вот по записи...
ZFS всегда читает и пишет по размеру recordsize (исключение, если файл занимает меньше, чем 1 recordsize, но файл БД занимает однозначно больше), по этой причине рекомендуется ставить для Базы Данных recordsize = 1 IO БД
Таким образом одна запись со стороны БД на 4к, меняет весь блок на 128КБ и заставляет перезаписать его.
Но важно отметить, что это никак не связано с SLOG. SLOG хранит в себе группы транзакций, А не весь блок, то есть
Пришла транзакция (TX, I/O запрос) на запись 8КБ.
Она попадает в SLOG и оперативную память.
ZFS объединяет их скопом (транзакции TX) до TGX (транзакционная группа) и так пока не дойдёт до размера dirty_bytes_max или tgx_timeout (2с или 5с по умолчанию), потому начинает уже процесс записи с чтением и записью новых блоков, но если питание пропадёт, то при запуске ZFS увидит, что в SLOG всё ещё лежит эта синхронная запись и начнёт заново весь процесс