4

У меня есть рабочая станция Ubuntu 16.04 с файловой системой ext4.

  1. Когда я играю с LxD, мне бы хотелось иметь возможность делать моментальные снимки с молниеносной скоростью (поскольку мои изображения обычно бывают большими). Эта способность, в моем понимании, была бы достижима, только если резервная файловая система представляет собой файловую систему CoW, такую как Btrfs.

(Примечание. Единственное серьезное предупреждение, касающееся производительности для Btrfs, с которым я сталкивался до сих пор, - это рекомендуемое использование флага монтирования noatime .)

  1. Но так как у меня также есть экземпляр MySQL в этой системе, производительность которого я бы не хотел видеть (относительно файловой системы ext4), я решил сделать одну последнюю проверку для любых потенциальных проблем с моим переключением на MySQL, поддерживаемый Btrfs. И посмотрите, что я нашел:

Обычно лучше монтировать Btrfs с 'nodatacow' , отключая копирование при записи, потому что COW вызывает фрагментацию, перебор блюд и скачки ЦП и ОЗУ, когда у вас много случайных записей.

Теперь это похоже на настоящий глушитель!

Вопрос: есть ли способ получить быстрый снимок и экземпляр MySQL с Btrfs?

2 ответа2

3

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

Причина этого довольно проста: каждый раз, когда блок изменяется, новый блок должен быть записан в другое место, отличное от исходного блока. Таким образом, даже если файл изначально был смежным, он не будет изменен.

Я не знаю, как Btrfs nodatacow взаимодействует со снимками, но у меня есть ощущение, что в момент, когда у вас есть снимок в наборе данных, вы запускаете по крайней мере частичное поведение копирования при записи независимо от того, какие флаги вы используете; в противном случае, как вы сможете получить доступ к старым данным через снимок?

Однако не обязательно, что это обязательно серьезно повлияет на производительность MySQL по двум причинам:

  • Современные диски действительно довольно быстрые для однопользовательских рабочих нагрузок (я полагаю, что вас это больше всего интересует, потому что вы упоминаете, что ваша система является "рабочей станцией")
  • Современные операционные системы имеют довольно хорошие алгоритмы кеширования, тем самым уменьшая необходимость в использовании физического хранилища

Просто чтобы дать вам представление, я сам запускаю ZFS (у которой Btrfs заимствует много идей), и в настоящее время идет процесс разработки. Рассматриваемый пул представляет собой шестидисковый raidz2, который на самом деле не известен своей звездной производительностью, физически обеспеченный шестью дисками 7200 об / мин (два SATA, четыре SAS), которые также точно не известны, в частности, для звездного IOPS. Скраб ZFS просматривает все дерево Merkle на диске, считывает все данные и проверяет контрольные суммы на всем, чтобы убедиться, что все считывает обратно, как это было ранее записано; в моем случае вычисление SHA-256 хешей всего на этом пути. Текущая скорость очистки (после того, как она преодолела начальную, тяжелую метаданную часть, которая включает в себя тяжелый поиск) колеблется прямо около 200 МБ / с и фактически медленно поднимается. И это для фактической тарелочки I / O, без кэширования вовлеченного (поскольку кэширование не имеет никакого смысла , если вы хотите , чтобы убедиться , что на постоянном хранении).

Конечно, очень вероятно, что вы увидите некоторое снижение производительности из-за фрагментации, если перейдете к файловой системе копирования при записи. Но вы не можете съесть торт и сохранить его тоже; если вам нужны быстрые, недорогие снимки, скорее всего, вам придется отказаться от чего-то другого, чтобы получить их.

То, что я бы сделал в вашем случае, является эталоном. Настройте некоторое хранилище Btrfs, поместите туда копию базы данных MySQL и посмотрите, как они работают при разумных рабочих нагрузках.

2

Я попробовал свой собственный комментарий, и все, кажется, работает нормально. Лучшие альтернативы все еще приветствуются.

Вот что я сделал.

# 1. Initial, onetime setup.
#   1.a) Create a sparse, 20G file.
      $ truncate -s 20G disk.20g

#   1.b) Format the loopback device with Btrfs.
      $ losetup /dev/loop0 disk.20g
      $ mkfs.btrfs /dev/loop0

# 2. Do this every time you wish to actually start using LxD.
# Note: Replace '/dev/loop0' with whatever loop-device is free on your system.
  $ sudo service lxd stop
  $ sudo mkdir -p /var/lib/lxd
  $ sudo mount -o noatime /dev/loop0 /var/lib/lxd
  $ sudo service lxd start

# 3. Do this to gracefully 'shutdown' the effects of Step 2.
  $ sudo service lxd stop
  $ sudo umount /var/lib/lxd
  $ losetup -d /dev/loop0
  $ sudo service lxd start

Итак, еще раз:

  1. Основная файловая система моей операционной системы - Ext4. Файл disk.20g выше находится только в этой файловой системе. Эта файловая система может по-прежнему размещать MySQL и другое программное обеспечение, чья производительность может отрицательно повлиять на Btrfs.
  2. LxD хранит свои изображения и контейнеры в разделе Btrfs. Это позволяет очень быстро делать снимки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .