Как оценить потребность в дедупликации ZFS

Как определить, поможет ли включение дедупликации, которая удаляет избыточные данные из файловых систем ZFS, сэкономить место на диске без снижения производительности.

Что такое дедупликация ZFS?

В Ubuntu 22.04 появилась возможность установки на файловую систему ZFS. Напомним, что ZFS родом из операционной системы Solaris, которая сейчас под ведением Oracle. В ZFS можно использовать свойство дедупликации (dedup) для удаления избыточных данных из файловых систем ZFS. Если в файловой системе ZFS включено это свойство dedup, тогда повторяющиеся блоки данных удаляются по мере их записи на диск. В результате на диске хранятся только уникальные данные, а общие компоненты совместно используются файлами.

В некоторых случаях дедупликация может привести к экономии дискового пространства и снижении стоимости хранения. Однако перед включением свойства dedup необходимо учитывать требования к оперативной памяти. Кроме того, подумайте, не станет ли вместо dedup, включение сжатия в ваших файловых системах отличным способом уменьшить потребление дискового пространства.

Выполните следующие оценочные действия перед тем как включить дедупликацию. Обратите внимание, что важно выполнить первые два шага, прежде чем пытаться использовать дедупликацию.

Шаг 1. Определите, можно ли дедуплицировать ваши данные

Определите, выиграют ли ваши данные от экономии места при дедупликации с помощью инструмента отладки ZFS, zdb. Если ваши данные не поддерживают дедупликацию, нет смысла включать файлы dedup.

Дедупликация выполняется с использованием контрольных сумм. Если блок имеет ту же контрольную сумму, что и блок, который уже записан в пул, он считается дубликатом и, таким образом, на диск записывается только указатель на уже сохраненный блок.

Таким образом, процесс дедупликации данных, которые не могут быть дедуплицированы, впустую будут тратить ресурсы ЦП. Дедупликация ZFS является внутренней. Это означает, что дедупликация происходит при записи данных на диск и влияет как на ресурсы ЦП, так и на ресурсы памяти.

Посмотрим какие есть пулы. И в примере ниже нам интересно рассматривать rpool.

$ zpool list
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
bpool 1.88G 241M 1.64G - - 0% 12% 1.00x ONLINE -
rpool 232G 121G 111G - - 2% 51% 1.00x ONLINE -

Теперь собираем информацию о характере данных. Например, если предполагаемый коэффициент дедупликации больше 2, вы можете увидеть экономию места при дедупликации. В примере, показанном в листинге ниже, коэффициент дедупликации меньше 2, поэтому включать dedup не рекомендуется.

$ zdb -S rpool
Simulated DDT histogram:

bucket              allocated                       referenced          
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
     1    1.17M    129G    104G    105G    1.17M    129G    104G    105G
     2    73.9K   6.49G   5.45G   5.50G     153K   13.5G   11.3G   11.4G
     4    7.42K    857M    711M    713M    33.0K   3.70G   2.97G   2.98G
     8     1019   87.2M   43.8M   44.7M    10.9K    993M    502M    511M
    16      151   9.06M   5.50M   5.70M    3.11K    186M    113M    118M
    32      109   1.50M   1.21M   1.29M    5.16K   68.6M   55.5M   59.3M
    64       14   1.16M   1.03M   1.04M    1.26K    113M    102M    103M
   128        4    258K     10K     16K      812   58.6M   2.19M   3.17M
   256        1    128K      4K      4K      445   55.6M   1.74M   1.74M
 Total    1.25M    136G    111G    111G    1.37M    147G    120G    120G

dedup = 1.08, compress = 1.23, copies = 1.00, dedup * compress / copies = 1.33

Шаг 2. Определите, достаточно ли памяти в вашей системе для поддержки операций дедупликации

Этот шаг имеет решающее значение, поскольку таблицы дедупликации потребляют память и в конечном итоге переполняются ещё и занимают место на диске. В этот момент ZFS должна выполнять дополнительные операции чтения и записи для каждого блока данных, для которого выполняется дедупликация, что приводит к снижению производительности. Система с большими пулами и небольшими объёмами памяти плохо выполняет дедупликацию. Некоторые операции, такие как удаление в большой файловой системе с включённым dedup сильно снижают производительность системы, особенно если система не соответствует требованиям к памяти.

Рассчитайте потребность в памяти следующим образом:

  • Каждая запись внутренней таблицы дедупликации (DDT) занимает примерно 320 байт.
  • Умножьте количество выделенных блоков на 320.

Для примера берём данные из листинга zdb, который мы делали выше:

Размер встроенного DDT (1.25M) x 320 = 400 MB памяти потребуется.

Шаг 3. Включение в ZFS свойства dedup

Убедитесь, что вы включаете свойство dedup только для тех файловых системы, в которых есть данные с возможностью дедупликации, и убедитесь, что в ваших системах достаточно памяти для поддержки операций дедупликации.

Какие точки монтирования у вашей файловой системы:

$ zfs list

Посмотрите, как в Ubuntu 22.04 была развёрнута по-умолчанию файловая система ZFS на картинке ниже:

Дедупликацию легко включить в файловой системе, например так (rpool/home замените на нужное):

$ zfs set dedup=on rpool/home

Резюме

После того как вы оцените два ограничения на дедупликацию, коэффициент дедупликации и требования к памяти, вы можете принять решение о том, следует ли внедрять дедупликацию и какова вероятная экономия.

Заметим, что в примере приведённом в этой статье включение опции dedup для файловой системы ZFS не потребовалось.

Ссылки