Назад | Перейти на главную страницу

Действительно ли ZFS проходит через все vdev, даже в очень больших пулах?

Я читал, что ZFS распределяет данные в zpool по всем vdev верхнего уровня, предполагая, что все vdev добавляются в начале жизни пула. Все, что я прочитал, кажется, считаю, что это хорошо. Но мне кажется, что при развертывании с большим количеством дисков это не приведет к хорошей общей производительности всех этих дисков в многопользовательской (или даже просто многопроцессорной) среде.

Предположим, например, у меня 96 дисков, которые я использую для создания 12 vdev по 8 дисков в каждом, и все они добавляются к моему zpool. Затем я откладываю его для пользователей, и они наполняют его всевозможным безумием. Некоторые файлы занимают десятки гигабайт, другие представляют собой небольшие файлы конфигурации пользовательского приложения и т. Д.

Позже пользователь A хочет скопировать несколько файлов размером в несколько гигабайт. Она запускает rsync или что-то в этом роде и испытывает невероятную производительность от базовых последовательных операций чтения с 12 полосатых vdev. Но затем пользователь B запускает другое приложение, которое также одновременно запрашивает довольно большие блоки данных. Теперь головки дисков постоянно снимаются с rsync пользователя A для работы с пользователем B, и, хотя каждое приложение индивидуально относительно последовательно, все 96 дисков участвуют в запросах обоих пользователей и видят шаблоны поиска и производительность, более согласованные со случайным вводом / выводом. О.

В этой конфигурации 12 vdev из 8 дисков каждый vdev по-прежнему имеет производительность на 8 дисков, поэтому я ожидаю, что последовательный ввод-вывод будет очень хорошим даже без дополнительного чередования между другими vdev. Разве для ZFS не было бы лучше разместить много гигабайт на одном vdev, прежде чем переходить к другому? (В моих экспериментах я получаю полосы около 500 тыс.). Таким образом, при чтении пользователя A вероятность использования тех же дисков, что и для чтения пользователем B, составляет лишь 1/12, и оба они получат производительность, соответствующую последовательному I / О большую часть времени.

Есть ли способ добиться от ZFS хорошей производительности при такой конфигурации / рабочей нагрузке?

ZFS всегда полосатая vdevs, хотя это зависит от того, сколько блоков требуется файлу - небольшие файлы часто помещаются в один блок и, таким образом, попадают в один vdev, если они не принадлежат набору данных, настроенному с копии = 2 или копии = 3.

Нет, вы не можете изменить это или разделить без создания отдельных пулов.

Чтобы повысить производительность по сравнению с такой настройкой с чередованием, ZFS включает собственный планировщик ввода-вывода в компонент ZIO (вот почему в Linux крайний срок или нет рекомендуется использовать планировщики).

Еще один уровень, улучшающий такие рабочие нагрузки, - это ARC который, среди прочего, включает кеш предварительной выборки. Вы можете ускорить ARC с помощью L2ARC на отдельных быстрых устройствах, с эквивалентом для синхронной записи SLOG (выделенные устройства ZIL).