Ускорение начальной синхронизации Bitcoin Core в Linux

Ускорение начальной синхронизации Bitcoin Core в Linux

В данном руководстве будет описано ускорение начальной синхронизации (IBD, первоначальной загрузки и проверки блокчейна Bitcoin) для клиента Bitcoin Core в операционных системах на ядре Linux. В моих условиях удалось добиться ускорения процесса более чем в 120 раз (19 часов против 17 недель)! Впечатляющий результат, не так ли? О том, как я смог добиться этого, и что подобный результат далеко не предел — под катом.

Тестовый полигон

Испытания проводились на следующем оборудовании:

  • AMD Phenom(tm) II X4 955 Processor
  • 8 Гб DDR3 ОЗУ
  • 3 Тб HDD
  • Arch Linux

Как видно, «тестовый стенд» имеет более, чем скромные ТХ. Забегая вперёд можно отметить, что третья строка явилась решающей при расчёте ускорения по данному способу. Но и на быстрых SSD прирост будет не малым, так что данный способ ускорения подходит для железа любой конфигурации, отвечающего минимальным характеристикам.

Минимальные системные требования

В принципе, данный способ ускорения начальной загрузки Bitcoin блокчейна подходит для любых систем с минимум 8 гигабайтами ОЗУ на борту. Важным так же является скорость подключения к сети интернет на машине, где будут происходить манипуляции. В моём случае ограничение загрузки на уровне 4 Мб/сек явилось т.н. «бутылочным горлышком», т.е. самым слабым местом, тормозящим весь процесс.

Меры предосторожности

Это очень важный пункт.

Ни в коем случае не проводите эксперименты с каталогами данных Bitcoin Core, содержащими кошельки с вашими битками! При неумелом, невнимательном, неосторожном манипулировании с каталогом данных Bitcoin Core можно потерять все имеющиеся средства без возможности их восстановления! Все ваши действия вы производите на свой страх и риск! И хотя если выполнить все описанные здесь действия верно, ничего плохого произойти не должно — я вас предупреждал, как говорится. Делайте резервные копии данных и храните их в надёжном месте, ведь может так случиться, что бекап — это единственное, что сможет спасти ваши биточки в случае ошибки в ваших действиях!

Усвоили? Тогда двигаем дальше.

Ограничения

Данный способ не предполагает хранения блокчейна в полном объёме (на момент написания руководства полный размер блокчейна Биткоина составлял ~330 Гб). Размер хранимого куска блокчейна будет ограничен крайними 2 гигабайтами. Для ситуации, при которой необходимо хранить блокчейн в полном объёме данный способ не подходит по техническим причинам, которые станут понятны далее. Если вам это подходит — тогда продолжим.

Подготовка

Нам понадобится любой из современных дистрибутивов Linux (Arch Linux, Debian, Ubuntu, Linux Mint, Manjaro и т.д.), какой именно — не важно, способ будет работать в любом из них. У меня, например, Arch Linux. В него нужно становить пакет bitcoin-qt. Как это сделать для разных дистрибутивов можно легко нагуглить в интернете. Будем считать, что с этим мы справились.

Выбор каталога с данными Bitcoin Core

Запускаем Bitcoin Core. При первом запуске приложение просит нас указать каталог, где будут храниться его данные вместе с блокчейном и кошельками. Например, у меня это

/mnt/data/Bitcoin/

Укажите каталог для хранения данных и не забудьте отметить обрезку блокчейна до крайних 2 Гб. Сделали? Ну всё, Bitcoin Core начал синхронизацию с сетью, которую мы теперь будем ускорять.

Создание ramdisk и перенос туда каталога с данными

Как уже понятно из названия, способ ускорения синхронизации Bitcoin Core с сетью заключается в помещении каталога с данными прямо в оперативную память машины. В этом и заключается вся «магия» данного способа ускорения. Какими бы быстрыми не были топовые SSD накопители, по скорости чтения/записи они с оперативной памятью всё равно и рядом не стояли. Смысл заключается в том, чтобы временно поместить каталог с данными Bitcoin Core в ОЗУ, там его обсчитать и уже полностью синхронизированным вернуть обратно на диск. Для этого нам нужно выполнить следующие шаги:

  1. Остановить Bitcoin Core;
  2. Создать и смонтировать ramdisk подходящего размера;
  3. Переместить в него каталог с данными Bitcoin Core;
  4. Запустить Bitcoin Core с указанием работать с каталогом данных на ramdisk;
  5. Дождаться синхронизации;
  6. Снова остановить Bitcoin Core;
  7. Переместить каталог с данными из ramdisk на жёсткий диск компьютера;
  8. Отмонтировать ramdisk.

Выполнив эти 8 пунктов, мы получим готовый к использованию Bitcoin Core, синхронизированный с сетью быстро и без лишней нагрузки на HDD/SSD. Приступим.

Выключаем Bitcoin Core и ждём его полной остановки. Создаём каталог, куда будет смонтирован ramdisk:

sudo mkdir /mnt/ramdisk && sudo chmod 750 /mnt/ramdisk/

Монтируем его в ОЗУ как ramdisk размером 7 Гб.

sudo mount -t tmpfs -o size=7G tmpfs  /mnt/ramdisk/
Не хватает места на рамдиске?

Добавьте объёма! -o size=8G, -o size=12G. Число перед «G» — объём ОЗУ в гигабайтах, который хотите отдать под рамдиск. Главное, чтобы у вас оставалось на операционку и сам Bitcoin Core. Мне хватило 7 гигабайт.

Следующим шагом будет копирование каталога с данными Bitcoin Core в ramdisk. Копировать можете любым файловым менеджером, можно и из консоли:

sudo cp -r /mnt/data/Bitcoin/* /mnt/ramdisk/

Меняем права на каталог для своего пользователя. Замените imatvey на себя:

sudo chown imatvey -R /mnt/ramdisk/

Теперь осталось запустить Bitcoin Core с указанием рабочего каталога в ramdisk:

bitcoin-qt -datadir=/mnt/ramdisk

Готово! Теперь Bitcoin Core манипулирует файлами в рабочем каталоге, находящемся целиком в ОЗУ, что даёт существенное ускорение процесса начальной синхронизации. В любом случае процесс должен сильно ускориться, а на сколько сильно — зависит от индивидуальных характеристик железа/подключения. Как я уже говорил, в моём случае слабое место — скорость интернет подключения, которое при синхронизации было забито на 100%, в то время как загрузка процессора не доходила и до 50%. Возможен вариант, когда скорости интернета будет достаточно, и всё упрётся в производительность процессора, который загрузит на 100%. В этом случае обязательно контролируйте температуру ЦП воизбежание перегрева.

Обратите внимание, что все манипуляции с файлами происходят в оперативной памяти компьютера, и при неожиданном отключении электричесва (в случае с ПК), после перезагрузки все данные с ramdisk безвозвратно будут потеряны. Поэтому, рекомендуется раз в несколько часов сихронизировать данные из рамдиска с каталогом на жёстком диске: останавливаем Bitcoin Core, копируем данные с рамдиска на жёсткий диск, запускаем снова.

Перенос синхронизированного каталога с данными Bitcoin Core из ramdisk на жёсткий диск компьютера

Когда процесс синхронизации с сетью завершён, останавливаем Bitcoin Core. Делаем резервную копию оригинального несинхронизированного каталога на жёстком диске на всякий случай:

sudo cp -r /mnt/data/Bitcoin/ /mnt/data/Bitcoin_bak

Удаляем все файлы из каталога Bitcoin Core на жёстком диске. Аккуратно.

sudo rm -r /mnt/data/Bitcoin/*

Копируем файлы из каталога в ramddisk на жёсткий диск:

sudo cp -r /mnt/ramdisk/* /mnt/data/Bitcoin/

Ну и на всякий случай устанавливаем принадлежность каталога с данными Bitcoin Core себе. Замените imatvey на своего пользователя.

sudo chown imatvey -R /mnt/data/Bitcoin

Отмонтируем ramdisk и удалим его каталог из /mnt:

sudo umount /mnt/ramdisk && sudo rm -r /mnt/ramdisk/

Запускаем Bitcoin Core и пользуемся.