Skip to content

Разделяемая память

Всё состояние блокчейна в узле VIZ хранится в едином файле с отображением в память (shared_memory.bin), управляемом библиотекой chainbase. Узел не может работать без этого файла.


Архитектура

процесс vizd
├── block_log / dlt_block_log  — сырые байты блоков (диск)
└── shared_memory.bin (mmap)   — всё состояние цепочки (chainbase)
    ├── account_index
    ├── witness_index
    ├── transaction_index
    └── ... (все остальные индексы объектов)

API-потоки (пул потоков веб-сервера) захватывают разделяемые блокировки чтения; применение блока удерживает эксклюзивную блокировку записи. Несколько читателей могут работать одновременно; запись блокирует всех читателей.


Конфигурация

Все параметры указываются в config.ini.

Параметры размера

ПараметрПо умолчаниюОписание
shared-file-dirstateКаталог для shared_memory.bin (относительно каталога данных или абсолютный)
shared-file-size2GНачальный объём. Если файл существует и значение больше — файл вырастает. Реплей не запускается.
inc-shared-file-size2GШаг автоматического увеличения при падении свободного места ниже порога
min-free-shared-file-size500MПорог свободного места, при котором запускается автоувеличение

Правило: min-free-shared-file-size должен быть меньше inc-shared-file-size, иначе возникнут каскадные изменения размера.

Параметры таймаута блокировок

ПараметрПо умолчаниюОписание
read-wait-micro500000 (500 мс)Таймаут одной попытки блокировки чтения
max-read-wait-retries3Максимальное количество попыток чтения перед ошибкой
write-wait-micro500000 (500 мс)Таймаут одной попытки блокировки записи
max-write-wait-retries3Максимальное количество попыток записи перед ошибкой

Параметры производительности

ПараметрПо умолчаниюОписание
single-write-threadfalseСериализовать все операции применения блоков/транзакций. Рекомендуется для продакшена.
block-num-check-free-size1000Проверять свободное место каждые N блоков
flush-state-intervalСбрасывать разделяемую память на диск каждые N блоков
clear-votes-before-block0Удалять голоса старше этого блока (0 = хранить все). Уменьшает потребление памяти.
skip-virtual-opsfalseПропускать уведомления о виртуальных операциях. Экономит CPU при реплее.

Рекомендуемые конфигурации

Узел-валидатор (продакшен):

ini
shared-file-size = 4G
inc-shared-file-size = 2G
min-free-shared-file-size = 500M
single-write-thread = true

API-узел (высокая пропускная способность чтения):

ini
shared-file-size = 8G
inc-shared-file-size = 2G
min-free-shared-file-size = 500M
single-write-thread = true
read-wait-micro = 1000000
max-read-wait-retries = 10
webserver-thread-pool-size = 256

Реплей / первоначальная синхронизация:

ini
shared-file-size = 8G
inc-shared-file-size = 4G
min-free-shared-file-size = 500M
block-num-check-free-size = 10
skip-virtual-ops = true

Автоизменение размера

База данных автоматически увеличивается, когда свободное место падает ниже min-free-shared-file-size. При каждом изменении размера:

  1. Приостанавливаются все операции (включая производство блоков и API-запросы).
  2. Уничтожается текущее отображение памяти.
  3. Файл увеличивается на inc-shared-file-size.
  4. Файл заново отображается, пересчитываются все указатели индексов.

Выделяйте shared-file-size с запасом, чтобы минимизировать частоту изменений размера. Каждое изменение вызывает скачок задержки.


Планирование размера

Ориентировочное использование для полного узла VIZ mainnet:

КомпонентОриентировочный размер
Индекс аккаунтов (~14 тыс. аккаунтов)~50 МБ
Индекс валидаторов~5 МБ
История операций (плагин operation_history)200–500 МБ
История аккаунтов (плагин account_history)100–300 МБ
Остальные индексы100–200 МБ
Рекомендуемый начальный размер4–8 ГБ

Последовательность запуска

1. Открыть shared_memory.bin (увеличить, если shared-file-size больше)
2. Захватить эксклюзивную блокировку файла
3. Инициализировать индексы
4. Если отсутствует genesis → init_genesis()
5. Открыть block_log или dlt_block_log
6. undo_all() → откатиться к последнему необратимому блоку
7. Проверить совпадение head блока с block log

Восстановление

СимптомДействие
CRITICAL: validator X account object MISSINGПовреждение — использовать --replay-from-snapshot --snapshot-auto-latest
Could not modify object, uniqueness constraint violatedПовреждение — использовать --replay-from-snapshot --snapshot-auto-latest
Unable to acquire READ lockКонкуренция за блокировку — увеличить read-wait-micro / включить single-write-thread
Узел зацикливается при запускеПовреждённый файл — --replay-from-snapshot --snapshot-auto-latest

Варианты восстановления:

  • --replay-from-snapshot --snapshot-auto-latest — удалить разделяемую память, импортировать последний снимок, выполнить реплей dlt_block_log.
  • --resync-blockchain — удалить разделяемую память и block log, синхронизироваться от пиров.
  • --snapshot <path> — загрузить из указанного снапшота, выполнить реплей dlt_block_log поверх.

См. также: Плагин chain, Плагин snapshot, Block log.