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

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

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

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

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

  • AMD Phenom™ 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 и поль­зу­ем­ся.