LINUX.ORG.RU

Дедупликация в Btrfs

 ,

Дедупликация в Btrfs

5

5

Btrfs — это замечательная файловая система, главными фишками которой являются легковесные снапшоты, реализуемые через Copy-On-Write (COW), и сжатие. Она показала высокую надежность и стабильность, и именно поэтому она включена в ядро Linux. Однако, даже наличие COW не позволяет избежать избыточности данных на уровне блоков.

Как возникает дублирование данных?

Дубликаты данных могут существовать, даже если не используются снапшоты

Типичная ситуация:

Когда вы обновляете пакет и создаете снимок файловой системы, фиксируется текущее состояние данных. Затем, если вы снова скачиваете обновление, оно может содержать почти те же самые данные, как предыдущее, с небольшими изменениями. Механизм Copy-On-Write отслеживает изменение файлов, помогая избежать дублирования блоков данных. Но простое переименование файла или его перемещение в другое место при обновлении (установка по другому пути) ломают этот механизм: и уже появляются одинаковые блоки с данными. С каждым новым обновлением и снимком количество таких одинаковых данных увеличивается. Эти дубликаты занимают место на диске, пока вы не удалите старые снимки, либо не выполните дедупликацию.

Дедупликация

Дедупликация — это процесс нахождения дубликатов данных и их удаления.

Существует два основных типа дедупликации:

  • In-band (онлайн) — когда данные перед записью проверяются на существование дубликатов. Такой метод требует значительных вычислительных ресурсов и памяти.
  • Out-of-band (офлайн) — дедупликация происходит после записи и является менее затратной по ресурсам.

Btrfs, в отличие от ZFS, реализует только офлайн-дедупликацию.

Сам Btrfs (обычно пакет btrfs-progs) не имеет встроенных утилит для дедупликации, но предоставляет все необходимые средства для ее реализации сторонними утилитами.

Дедупликация бывает на уровне файлов и на уровне блоков. Чтобы найти и удалить одинаковые файлы, вы, конечно, можете использовать duperemove. Но у него применение довольно специфическое, что делает его практически бесполезным для наших целей, тем более cp в Btrfs не приводит к реальному копированию данных (копии файлов ничего не весят). Строго говоря, Btrfs работает не с файлами, а с блоками данных (экстентами), поэтому и дедупликацию в ней нужно проводить на этом уровне. Для этих целей и существует bees.

Bees — блочный дедупликатор

BEES — это не пчелы, а аббревиатура от Best-Effort Extent-Same. Эту идиому можно перевести как науличший достижимый одинаковый диапазон. Звучит бредово, если не знать, что экстенты-диапазоны — это просто блоки данных. Данная утилита проверяет чексумы этих блоков, которые иногда называют хешами, если она находит совпадение, то копия блока заменяется на ссылку на него.

Установка:

yay -S bees

Для начала нужно узнать UUID корневой файловой системы:

$ sudo btrfs fi show /
Label: none  uuid: 83ba9a0a-7858-48f0-b679-618954059b1a
        Total devices 2 FS bytes used 153.13GiB
        devid    2 size 449.98GiB used 223.03GiB path /dev/mapper/root1
        devid    3 size 449.98GiB used 223.03GiB path /dev/mapper/root2

Затем создайте конфигурационный файл для bees, например, /etc/bees/root.conf.

Укажите в нем UUID:

UUID=83ba9a0a-7858-48f0-b679-618954059b1a

Задайте размер базы экстентов:

DB_SIZE=$((256*1024*1024)) # 256MiB в байтах

Рекомендованный размер базы экстентов («хеш-таблицы») приведен в документации:

unique data size |  hash table size |average dedupe extent size
    1TB          |      4GB         |        4K
    1TB          |      1GB         |       16K
    1TB          |    256MB         |       64K
    1TB          |    128MB         |      128K <- рекомендуется
    1TB          |     16MB         |     1024K
   64TB          |      1GB         |     1024K

Эта таблица показывает рекомендованные размеры для различных объемов уникальных данных. База хешей экстентов полностью грузится в оперативную память и периодически сбрасывается на диск, так что можно сказать, что вы тут указываете сколько вам не жалко выделить оперативной памяти для дедупликации. 128K — это стандартный размер экстента, но учтите, что это не постоянная величина. Чтобы не ошибиться, можно просто задать размер хеш-таблицы в 1 GB, если, конечно, количество RAM позволяет.

Для вывода только предупреждений и ошибок при работе beesd добавьте в конфиг:

OPTIONS="-P -v 6"

Проверьте перед этим файловую систему на ошибки и обязательно исправьте их перед запуском

Запуск дедупликации вручную:

sudo beesd 83ba9a0a-7858-48f0-b679-618954059b1a

Не ждите окончания процесса дедупликации. Он будет продолжаться бесконечно и в начале будет очень сильно грузить процессор.

В Arch вместе с пакетом идет systemd-юнит. Если хотите чтобы сервис запускался автоматически при старте системы выполните:

sudo systemctl enable --now beesd@83ba9a0a-7858-48f0-b679-618954059b1a

Проверка статуса дедупликации:

cat /run/bees/83ba9a0a-7858-48f0-b679-618954059b1a.status

Плюсы и минусы блочной дедупликации

Дедупликация позволяет значительно экономить место. Запуск beesd гарантированно увеличит свободное место на разделе и уменьшит занятое на 25-30%. Но она требует памяти и CPU. На очень слабых машинах это может быть критичным.

Самая идиотская затея — запустить дедупликацию на поврежденной файловой системе, особенно если повреждения вызваны битой памятью. Это почти гарантированно приведёт к безвозвратной потере данных!

Ссылки

★★

Проверено: hobbit ()
Последнее исправление: rtxtxtrx (всего исправлений: 19)

Для проверки целостности файловой системы и исправления ошибок:

~/workspace
❯ sudo btrfs scrub start -Bd /
Starting scrub on devid 2
Starting scrub on devid 3
Scrub device /dev/mapper/root1 (id 2) done
Scrub started:    Tue Dec  3 07:19:01 2024
Status:           finished
Duration:         0:02:28
Total to scrub:   125.94GiB
Rate:             871.38MiB/s
Error summary:    no errors found

Scrub device /dev/mapper/root2 (id 3) done
Scrub started:    Tue Dec  3 07:19:01 2024
Status:           finished
Duration:         0:03:03
Total to scrub:   125.94GiB
Rate:             704.72MiB/s
Error summary:    no errors found
rtxtxtrx ★★
() автор топика

Как появились первые nvme SSD, ушел c btrfs на ext4 на десктопе, на nvme SSD btrfs очень часто теряла данные. На серверах в RAID-10 тоже ушел на ext4, у OVH частично ….банное оборудование и там через 2.5 года юзания стало слишком часто ядро в панику уходить на BTRFS. С тех пор не экспериментирую с btrfs и от ее использования полностью отказался.

В средах же где имеешь очень ограниченное место, btrfs вообще противопоказана, так как если закончится место, то нужно подключать флешку и делать rebalance. Да я сейчас на серверах ушел на RAID-1 везде.

В целом вспоминаю btrfs как страшный сон. В целом сейчас склоняюсь в сторону mdadm + ext4 вместо btrfs RAID. Тем более по производительности btrfs сливает ext4, хотя раньше были кейсы где btrfs выигрывала, но сейчас что вижу на похорониксе, btrfs чувствует себя так себе, где-то по-середине.

Но в целом если бы был выбор ZFS vs BTRFS, без возможности использования mdadm для raid, я бы конечно выбрал BTRFS ибо ZFS очень тормозная, в целом. Но в жизни, не видел чтобы прям были такие жесткие ограничения для выбора, типо только двух фс и без использования чего-то другого.

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от anonymous_sama

Как появились первые nvme SSD, ушел c btrfs на ext4 на десктопе, на nvme SSD btrfs очень часто теряла данные.

можно ли тут чуть подробнее - отчего btrfs на ssd теряет данные, а ext4 на нем же нет ?

я вот думаю (на своих десктопах) попробовать использовать btrfs на новых установках ОС - ради сжатия, да и не думать сколько инодов выделить заранее для ext4

x905 ★★★★★
()
Ответ на: комментарий от x905

Бтрфс имеет чексуммы на данные, так что в случае проблем с железом сразу видно что побилось. Екст4 чексумм на данные не имеет, так что в случае проблем с железом проблем не видно. А если не видно то их и нет! Сиди кайфуй!

Behem0th ★★★★★
()
Ответ на: комментарий от anonymous_sama

В средах же где имеешь очень ограниченное место, btrfs вообще противопоказана, так как если закончится место, то нужно подключать флешку и делать rebalance. Да я сейчас на серверах ушел на RAID-1 везде.

А можно включить сжатие и выгадать свободного места.

Behem0th ★★★★★
()
Ответ на: комментарий от Behem0th

Бтрфс имеет чексуммы на данные

имеешь ввиду «нет чексуммы - нет потери данных» ? )

x905 ★★★★★
()
Ответ на: комментарий от x905

Если ты уйдешь в ro на BTRFS, после rebalance ты можешь потерять частично данные из-за которых ты и ушел в ro. Я так после rebalance процентов 20 данных потерял, они просто не успевали записываться. На nvme шанс потерять данные повышаются, так как они могли еще не записаться (особенно в raid), c barrier конечно шанс, что ты потеряешь меньше, но вот nobarrier, который рекомендуется во всех руководствах по оптимизации, однако бесперебойник тебя не спасет, в случае если оборудование зависнет и придется выключать по кнопке…

Если же у тебя еще и шифрование, то твой шанс возрастает еще больше, вплоть до невозможности восстановления.

А можно включить сжатие и выгадать свободного места.

По моему вообще мало кто без сжатия BTRFS использует.

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

raid с nobarrier

Если быть целеустремлённым, то ничего не сможет встать на пути!

Behem0th ★★★★★
()
Последнее исправление: Behem0th (всего исправлений: 1)

Btrfs — это замечательная файловая система

Враньё с первой строки. btrfs - непригодная к промышленной эксплуатации ФС.

Pohmetolog
()
Ответ на: комментарий от Pohmetolog

в документации прямо написано, что nobarrier может повредить файловую систему, если нет бесперебойника либо разрядится батарея. для таких людей пишут инструкции на бензопилах мол не пытайтесь остановить, схватившись руками. вообще все эти разгонщики-оптимизаторы страныне люди, да еще с какими-то когнтивными нарушениями: не он виноват, что данные похерелись, а файловая система с нестандартными настройками — твердо и четко!

rtxtxtrx ★★
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

а файловая система с нестандартными настройками — твердо и четко!

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

Pohmetolog
()
Ответ на: комментарий от anonymous_sama

Если ты уйдешь в ro на BTRFS, после rebalance ты можешь потерять частично данные

по какой причине btrfs уйдет в ro ?

x905 ★★★★★
()
Ответ на: комментарий от x905

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

До сих пор в закладках лежит, сталкивался со всем из этих заметок, плюс рандомный выход в ro на nvme на файлах с некоторыми атрибутами chattr и файлами при установки dpkg пакетов.

Можешь проверить я с 16го года (или даже раньше), агитировал за BTRFS, использовал для критичных проектов, как результат в 2020 я отказался от использования BTRFS везде, и у меня не осталось ни одной машины с BTRFS, за время использования я собрал все возможные грабли и помог исправить поддержку показа свободного места для BTRFS в netdata

Мне жаль, если я кого-то подтолкнул даже случайно к использованию BTRFS, поэтому сейчас, я наоборот посоветую держаться подальше от этой ФС, и вообще от COW как от тупиковой ветви развития.

Если вам нужна дедупликация, лучше реализовывать ее в рамках архитектуры приложения, а не на уровне ФС.

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

от btrfs я хотел бы сжатия, удобно для исходников, а т.к. тамже (и вообще по диску) множество мелких файлов, то помогли бы динамические иноды

ничего иного для моего десктопа не надо

x905 ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.