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 ★★★★★
()
Ответ на: комментарий от anonymous_sama

До сих пор в закладках лежит

Ого статья 10-летней давности. Как раз того периода, когда еще бажную Btrfs включили в ядро. Это сейчас «очень актуально».

как результат в 2020 я отказался от использования BTRFS везде

Использую на сервере и радуюсь жизни.

Очень удобно:

ssh -p 1234 root@server 'tar -czf - -C "/srv/.snapshots/$(ls -1 /srv/.snapshots/ | tail -n 1)/snapshot" .' > backup.srv.tar.gz

за время использования я собрал все возможные грабли и помог исправить поддержку показа свободного места для BTRFS в netdata

btrfs fi df

Ну теперь ты «эксперт», чей уровень «неоспорим».

Мне жаль, если я кого-то подтолкнул даже случайно к использованию BTRFS

Теперь ты агитируешь всех против. Ок.

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

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

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

А как там с уменьшением размера пулов и сменой типа рейдов на лету? Никак??? ZFS к проду готов четко и однозначно!!! Это по факту файловая система для фалопомойки, а не хранения важных данных

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

Я склоняюсь к мысле, что если кто-то пишет, «я использую» он уже агитирует.

Ого статья 10-летней давности. Как раз того периода, когда еще бажную Btrfs включили в ядро. Это сейчас «очень актуально». Это было актуально еще 5 лет назад, точно и я уверен будет актуально до сих пор

Когда-то тоже начал использовать с мыслью, что это неактуально. Но думается что BTRFS уже третью-четвертую волну людей затягивает.

2009-2014 - Ну типо они же первопроходцы

2014-2017 - Ну уже все пофиксили в апстриме

2017-2021 - Ну ну это же уже стабильно, или нет?

2022-2024 - Ну меня то точно не заденет, просто они все были неосиляторы?

2024-xxxx - И вот еще одно поколение вляпалось в это дерьмо под названием BTRFS

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

Можно провести простой тест, записать данные на ext4 с nobarrier, и потом резко выключить питание, и сделать тоже самое на BTRFS c nobarrier.

Ext4 выживет, после двадцати и более циклов, BTRFS скорее всего потеряет данные уже на 3-4 цикле, если не раньше.

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

Можно провести простой тест, записать данные на ext4 с nobarrier, и потом резко выключить питание, и сделать тоже самое на BTRFS c nobarrier.

🤦🏼‍♀️ ну это, конечно, доказывает, что Btrfs «дерьмо», а вот Lexus не умеет по оврагам ездить как Нива => Lexus дерьмо.

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

А зачем за скоростью записи гнаться, рискуя потерей всех данных, если на типичном серваке все упирается в ширину канала 1000 MBit/s ~125 MiB/s?

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

А как там с уменьшением размера пулов и сменой типа рейдов на лету? Никак???

А как там с проектированием стораджа? Никак? :)

ZFS к проду готов четко и однозначно!!!

ZoL в проде с 2012 года, никаких нареканий.

Это по факту файловая система для фалопомойки, а не хранения важных данных

Ну да, ну да… Сотни ВМ на zvol это неважные данные :) Кстати, как там у btrfs с блочными устройствами? Никак? Ну ладно, попробуй в файле raw или qcow2 виртуалку погонять на btrfs, производительность ниже плинтуса.

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

А как там с проектированием стораджа? Никак? :)

Вместо ответов на неудобные вопросы, троллер перешел в контр-атаку.

Кстати, как там у btrfs с блочными устройствами? Никак?

Тесты покажи. Почему я тебе должен верить как и субъективному мнению анонимной самсы? И зачем линупсоиду виртуалки, когда есть докер… Че то запахло чем-то… чую винду

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

троллер

Мотороллер. btrfs нигде нет в продакшене, угадай почему?

Тесты покажи.

Тесты btrfs в роли блочного устройства? Не представляется возможным, btrfs не может в блочное устройство :)

И зачем линупсоиду виртуалки, когда есть докер…

Зачем тухлый докер, когда есть lxc?

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

Как раз сегодня сказала КРЯ, безальтернативно приказав «удалить пул и создать заново»

ZFS на исправном железе КРЯ? Настало время офигительных историй :) Идите в толксах детям сказки рассказывайте.

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

ты писал про raw-файлы и qcow2. с ними тесты давай

Я не пользуюсь плохими ФС. Поставь любую виртуалку в файл на btrfs и убедись что она стоит колом и работать в ней невозможно. Вам Шишкин ещё лет 10 назад всё объяснил, с тех пор ничего не изменилось. Авторы этого поделия как не могли в матан, так и не могут до сих пор, деградация.

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

Все с тобой ясно.

не могли в матан

Осторожно математик в треде, все в машину! Напиши свою файловую систему на математике своей и сиди на ней. Не можешь? А на C можно!

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

Все с тобой ясно.

Не осилил ВМ на btrfs поставить? Да, очень долго, но можно, особенно привычным к страданиям на альфа версиях ФС :)

Осторожно математик в треде

Авторы btrfs реальные буратины, не осилили теорию бинарных деревьев, неграмотные они, мягко выражаясь.

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

Вообще-то у HDD есть контрольные суммы каждого сектора и они проверяются и в SATA контрольные суммы, и на уровне ATA/SCSI кажется что-то такое было, не уверен. Может только SCSI. И нечитаемый сектор – это именно с ошибкой. И на самом деле выдает мусор – редкий винт. Действительно были такие, которые мусор выдавали вместо ошибок, но это скорей исключение. Да и в каком-нибудь смарте видно, что ошибок масса и винт их «исправляет» (путем многократного перечитывания и переноса сектора в другое место).

Но вообще пару раз в жизни я сталкивался с искажениями файлов. Один раз было вообще незабываемо. В текстовом файле конфигурации GoldEd в каком-то ключевом слове (только латинские буквы) латинская H заменилась на русскую Н. Кто знает уже поймет. Мало того, что глазами не видно, так я бы даже в наркотическом пьяном угаре не смог бы сам такое проделать, т.к. в русификаторе keyrus естесственно никаких русских «Н», «р» и «у» не было (заменялись на латинские, как было принято в Фидо, последние две – из-за Maximus-BBS). Код буквы H– 0x48 (01001000), код русской Н в CP866 – 0x8D (10001101). Изменилось ЧЕТЫРЕ бита! Голдед не стартовал. Его файл конфига никакие другие программы писать не должны были. ОС – Windows-95, или 98. Естесственно FAT. Что это было??? Мистическая история. Если ошибка чтения жесткого диска, то там же как минимум 2-байтный CRC который аж до 16 бит-флипов ловить должен. Такую ошибку уж точно. Ошибка в контроллере, порча памяти?

Потом по сети пытался файл передать. Многократно и безуспешно. Через FTP не качался, через Windows Explorer не качался, всё время какие-то зависания. Именно на этом файле и именно на этом компе. Файл был запакован архиватором и успешно передан… Потом вроде сетевуху заменили и все стало ок.

Потом файлы бились при копировании между разными HDD. Тогда ещё Parallel ATA было. В чем поблема не понятно. Кажется в самом контроллере, не в HDD. Еще были CD-ROM не способные прочитать определенные файлы, а на других читались. Ну это известная история: у них там последовательность после скремблинга превращалась в длинную серию нулей, и последняя неправильно интерпретировалась. На линуксе натыкался на пропадание файла с ext3. В смысле файл на месте, но внутри нули. Файл полгода никто не трогал.

На битую память несколько раз в жизни натыкался и кажется это самая большая проблема: что-то попадает в кеш диска внутри ОС, бьётся, и потом записывается обратно! Конечно read-only файл так не побьётся, но структура файловой системы или база данных – запросто. Причём память имеет тенденцию начать глючить неожиданно, и хуже того, глючить в зависимости от фазы луны и погоды на марсе. Не поймаешь бывает. Почему лучше ECC.

Собственно ядро линукса у которого общее поле памяти на всё – так же удобней и быстрей (портить кому-то память). И сбой в каком-то драйвере может удачно попадать в пейджкеш или куда-то ещё.

Про сбоящие процессоры в последнее время не слышно, но когда-то были такие и тоже можно допустить, что будет подгаживать где-то. Копирование данных в современном CPU делается как раз преимущественно векторными инструкциями, нагревающими CPU больше всего. И копируется обычно что-то как раз связанное с файловой системой. Со всеми вытекающими последствиями.

Так что контрольные суммы файлов послезны. Но не суммы, а скорей хеши. Когда предлагают CRC32 – это издевательство над здравым смыслом.

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

Для виртуалок уже наконец-то вроде virtfs сделали, когда ядро виртуалки свои файловые операции хосту отдаёт? И так вроде сильно быстрей и пейджкеш общий шарится. Не для хостингов конечно, там юзера должны быть изолированные.

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

А зачем за скоростью записи гнаться, рискуя потерей всех данных, если на типичном серваке все упирается в ширину канала 1000 MBit/s ~125 MiB/s?

Это что за сервант такой? Где такое «типично» встречается :)

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

Для виртуалок уже наконец-то вроде virtfs сделали

Не щупал, на досуге посмотрю.

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

посмотри рег.ру или рекламируемый тут селестел. там и по 100 мбит есть. так то сейчас стандарт 10 гбит, но и это 1-3 гб/с записи требует. а вообще ты странный и производишь впечатление не совсем вменяемого человека. не пиши мне. тут есть темы плоскоземельцев, флуди в них, за сообщения в статьях рейтинг не дают

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

тут есть темы плоскоземельцев, флуди в них

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

так то сейчас стандарт 10 гбит, но и это 1-3 гб/с записи требует.

Ещё раз вопрос повторю, какая связь между скоростью сети и дисковым i/o на сервере? :) В курсе что хороший запрос к БД скушает всё i/o и весь iops при нулевой нагрузке на сеть?

Pohmetolog
()
Последнее исправление: Pohmetolog (всего исправлений: 2)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.