
Я настраиваю сервер, на котором запущено 3 пула ZFS, 2 из которых имеют узкоспециализированное назначение, и мне кажется, что рекомендации по умолчанию просто не оптимизированы для них. Сетевое взаимодействие обеспечивается двумя адаптерами 10 Гбит.
Пул 1 — это большое файловое хранилище, оно содержит необработанные видеоданные, которые редко записываются и читаются, а также случайные резервные копии. Нет абсолютно никакого смысла кэшировать что-либо из этого пула, так как это данные с высокой пропускной способностью, которые считываются за один проход от начала до конца, кэширование чего-либо из него будет пустой тратой памяти. Задержка не является такой уж большой проблемой, а пропускной способности вполне достаточно из-за высокой степени сжатия данных. Пул состоит из 8 жестких дисков в режиме z2, полезная емкость составляет 24 ТБ.
Пул 2 — хранилище сжатых видеокадров. Части этого контента часто считываются при компоновке видеопроектов. Доля часто используемых данных обычно превышает общий объем оперативной памяти сервера, есть требование к низкой задержке, но не сверхнизкой, пропускная способность важнее. Пул состоит из 3 HDD в z1, полезная емкость 8 ТБ и 1 ТБ NVME SSD для L2ARC.
Пул 3 — это общее хранилище, используемое в качестве хранилища для нескольких компьютерных систем, которые загружают и запускают программное обеспечение с него, а не локального хранилища. Поскольку он должен обслуживать несколько машин и основное системное хранилище, требования к задержке и пропускной способности здесь самые высокие. Из этого пула в основном считывается, записи ограничиваются тем, что делают клиентские системы. Пул состоит из 3 SATA SSD в режиме z1, 1 ТБ полезной емкости.
Моя цель при оптимизации заключается в минимизации размера ARC для первых двух пулов с целью максимизации размера ARC для третьего.
Пул 1 не получает никакой выгоды от кэширования, так какое минимальное безопасное значение ARC я могу для него установить?
Pool 2 может выиграть от ARC, но это того не стоит, так как L2ARC достаточно быстр для этой цели, а емкость диска составляет 1 ТБ. В идеале я был бы счастлив, если бы мог обойтись без использования ARC для этого тома и использовать весь терабайт L2ARC, но похоже, что для данных заголовка L2ARC требуется по крайней мере немного ARC.
Итак, учитывая емкость L2ARC в 1 ТБ и размер записи пула в 64 КБ, 1 ТБ / 64 КБ * 70 КБ дает мне ~0,995 ГБ. Означает ли это, что я могу безопасно ограничить ARC для этого пула в 1 ГБ? Или, может быть, ему нужно больше?
Похоже, что ARC содержит как кэш чтения, так и информацию для обработки L2ARC, поэтому похоже, что мне нужна какая-то опция, чтобы сделать акцент на управлении большим L2ARC, а не на кэшировании фактических данных в ОЗУ. И при необходимости, предписать, чтобы любые вытеснения кэша из ARC переносились в L2ARC в случае, если политики вытеснения кэша не соответствуют обычным политикам иерархии кэширования.
Общие рекомендации, которые я читал, предполагают около 1 ГБ ОЗУ на 1 ТБ хранилища, я планирую 32 ГБ ОЗУ на 33 ТБ хранилища, что я почти в точку, но 4 или 5 к 1 для L2ARC против ARC, чего я довольно сильно не дотягиваю. Цель состоит в том, чтобы сократить ARC пула 1 как можно меньше и сократить ARC пула 2 только до того, что ему нужно, чтобы иметь возможность использовать весь 1 ТБ L2ARC, чтобы максимизировать ОЗУ, доступную для ARC для пула 3.
решение1
Во-первых, я настоятельно рекомендую вам пересмотреть вашу схему для пулов №2 и №3: 3-стороннее зеркало не даст вам ни низкой задержки, ни высокой пропускной способности. Вместо дорогого диска NVMe на 1 ТБ для L2ARC (который, кстати, несбалансирован из-за небольшого ARC на 32 ГБ), я бы использовал больше дисков на 7200 об/мин в режиме RAID10 или даже более дешевые, но надежные SSD (например: Samsung 850 Pro/Evo или Crucial MX500).
Как минимум, вы можете поместить все диски в один пул RAID10 (с SSD L2ARC) и сегментировать этот единый пул с помощью нескольких наборов данных.
Тем не менее, вы можете указать, как следует использовать ARC/L2ARC для каждого набора данных, используя параметры primarycache
и secondarycache
:
zfs set primarycache=none <dataset1> ; zfs set secondarycache=none <dataset1>
отключитлюбойКэширование ARC/L2ARC для набора данных. Вы также можете выдатьzfs set logbias=throughput <dataset1>
привилегию пропускной способности вместо задержки во время операций записи;zfs set primarycache=metadata <dataset2>
включит кэширование только метаданных для второго набора данных. Обратите внимание, что L2ARC питается ARC; это означает, что если ARC кэширует только метаданные, то же самое будет верно и для L2ARC;- оставьте параметр ARC/L2ARC по умолчанию для третьего набора данных.
Наконец, вы можете настроить свой экземпляр ZFS на использование более 50% (по умолчанию) оперативной памяти для ARC (ищите zfs_arc_max
встраница руководства модуля)