Добрый день!
ChatGPT говорит primarycache=metadata хорошо под виртуализацию. Верить? нет?
primarycache=metadata хорошо под виртуализацию
сначала надо понять, что в данном случае означает слово "хорошо".
если "хорошо" - это уменьшение использования RAM под ARC - то да.
если "хорошо" - это ускорение работы с дисковой подсистемой - то нет.
для zvol в документации рекомендуется volblocksize устанавливать равным 16K, при этом внутри виртуальных машин использующих этот виртуальный диск для своих целей размер блока при работе с диском, как правило, равен 4K.
Следовательно, если виртуальная машина работает с диcком блоками размером 4K, а zvol пишет блоки размером 16К, то при частичной модификации только 4К необходимо будет прочитать весь блок 16К, изменить в нем 4К и обратно записать 16К на диск, так что при включенной компрессии эти "виртуальные" 16К на диске могут физически занимать 0К, 4К, 8К, 12К, 16К.
и если primarycache=metadata то в таком случае в ARC не будет данных и в 100% случаев их придется читать с диска.
если же primarycache=all то в таком случае в ARC могут оказаться данные и тогда read-modify-write при volblocksize=16K пройдет быстрее, потому что в некоторых случаях недостающие фрагменты данных можно будет взять прямо из ARC, без необходимости повторно читать их с диска. Если выставить volblocksize=4K тогда не будет write amplification и работы в режиме read-modify-write, но тогда и компрессия работать не будет.
исходя из этих соображений - я на серверах всегда оставляю настройку primarycache=all по умолчанию и не меняю ее на primarycache=metadata никогда, потому что не вижу разумных причин этого делать - потому что мне лучше чтобы дисковая подсистема виртуальных серверов работала быстрее, и я готов за это отдать под ARC от 8 до 64 GiB памяти сервера. А если фактически выключу использование ARC через primarycache=metadata то получу экономию памяти на гипервизоре, но ценой некоторого замедления работы виртуальных дисков виртуальных машин. А зачем мне нужна свободная память на гипервизоре, если она будет просто простаивать и не будет приносить никакой пользы? Лучше уж ее отдать под ARC и получить ускорение работы дисковой подсистемы у всех виртуальных машин.
и всегда ставлю volblocksize=16K потому что это наиболее разумный баланс, чтобы и компрессия работала и overhead от write amplification не был бы очень большим. Если надо убрать до нуля write amplification - то можно поставить volblocksize=4K, но тогда и компрессии вообще не будет и для RAIDZ2/RAIDZ3 overhead будет [очень(?)] большим.
если же данные меняются очень редко и нужна максимальный уровень компрессии - то тогда и volblocksize поставить можно побольше и алгоритм компрессии изменить с lz4 на что-то с лучшим уровнем сжатия, zstd, например, или gzip.
рекомендация Limit ZFS Memory Usage выглядит разумной в плане того, меньше какого размера ARC не следует устанавливать: As a general rule of thumb, allocate at least 2 GiB Base + 1 GiB/TiB-Storage. For example, if you have a pool with 8 TiB of available storage space then you should use 10 GiB of memory for the ARC. Но если в сервере есть больше оперативной памяти и она не используется виртуальными машинами - то лучше ее всю будет отдать под ARC, тогда производительность файловой системы будет еще выше. При этом - смотреть чтобы на bare metal server / гипервизоре не вытеснялось очень много страниц в swap из RAM, чтобы не было интенсивного swap in / swap out. И разумеется, у каждой виртуальной машины должен быть свой собственный личный swap на отдельном виртуальном диске, для которого не надо делать снапшоты и не надо его бекапить. Тогда виртуальная машина будет знать, где у нее RAM, где у нее swap, и ситуации Out Of Memory будут просто невозможными, если swap у виртуальной машины делать на виртуальном диске который размещен на thin provisioned zvol - тогда swap partition может быть и 256 GiB, все равно физически на диске сервера такой виртуальный своп будет занимать очень мало места.