1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/paradigm4-pmemstore

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ENGINES-experimental.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 12:50 3ebaa4f

Экспериментальные движки хранения для pmemkv

  • tree3
  • csmap
  • radix
  • stree
  • robinhood
  • pskiplist

Tree3

Постоянный однопоточный движок, основанный на оптимизированном для чтения дереве B+. По умолчанию отключён. Его можно включить в CMake с помощью опции ENGINE_TREE3.

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

Конфигурация должна указывать путь к постоянному пулу PMDK, который может быть файлом (в файловой системе DAX), устройством DAX или файлом набора пулов PMDK.

  • path — путь к пулу базы данных (с макетом «pmemkv_tree3»), который нужно открыть или создать.
    • тип: строка;
  • create_if_missing — если 1, pmemkv пытается открыть пул и, если это не удаётся, создаёт его. Если 0, pmemkv будет полагаться на настройку флага create_or_error_if_exists. Если оба флага create_* будут равны 0 — pmemkv откроет пул (если путь не существует — произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • create_or_error_if_exists — если 1, pmemkv создаст файл (но произойдёт сбой, если путь существует). Если 0, pmemkv будет полагаться на настройку флага create_if_missing. Если оба флага create_* будут равны 0 — pmemkv откроет пул (если путь не существует — произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • size — требуется только в том случае, если любой из вышеуказанных флагов равен 1. Указывает размер базы данных в байтах для создания.
    • тип: uint64_t;
    • минимальное значение: 8388608 (8 МБ).

Для более подробного описания конфигурации см. раздел cmap в libpmemkv(7).

Внутреннее устройство:

Tree3 использует гибридную реализацию дерева B+ с использованием отпечатков пальцев. Вместо того чтобы хранить внутренние и листовые узлы дерева в постоянной памяти, tree3 использует гибридную структуру, где внутренние узлы хранятся в DRAM, а листовые — только в постоянной памяти. Хотя tree3 должен восстанавливать все внутренние узлы при запуске движка, поиск выполняется в DRAM за исключением окончательного чтения из постоянной памяти.

Листовые узлы в tree3 содержат несколько пар ключ-значение, индексированных с использованием однобайтовых отпечатков пальцев (хешей Пирсона), которые ускоряют поиск заданного ключа. Модификации листа ускоряются с помощью обновлений с нулевым копированием.

Предварительные требования:

Никаких дополнительных пакетов не требуется.

Csmap

Постоянный, параллельный и отсортированный движок, поддерживаемый списком пропусков. По умолчанию отключён. Может быть включён в CMake с помощью параметра ENGINE_CSMAP (требуется поддержка C++14).

Все методы csmap являются потокобезопасными. Put, get, count_* и get_* масштабируются в зависимости от количества потоков. Метод remove в настоящее время реализован так, что берёт глобальную блокировку — он блокирует все остальные потоки.

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

  • path — путь к пулу базы данных (макет «pmemkv_csmap»), который необходимо открыть или создать.
    • тип: строка;
  • create_if_missing — если 1, pmemkv попытается открыть пул, и, если это не удастся, создаст его. Если 0, pmemkv будет полагаться на настройку флага create_or_error_if_exists. Если оба флага create_* равны 0 — pmemkv откроет пул (если путь не существует — произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • create_or_error_if_exists — если 1, pmemkv создаст файл (но произойдёт сбой, если путь существует). Если 0, pmemkv будет полагаться на настройку флага create_if_missing. Если оба флага create_* равны 0 — pmemkv откроет пул (если путь не существует — произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • size — требуется только в том случае, если любой из указанных выше флагов равен 1. Определяет размер базы данных в байтах для создания.
    • тип: uint64_t.

Более подробное описание конфигурации см. в разделе cmap в libpmemkv(7).

Предварительные требования:

Никаких дополнительных пакетов не требуется. Отключено по умолчанию. Можно включить в CMake с помощью параметра ENGINE_RADIX.

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

  • path — путь к пулу базы данных (формат «pmemkv_radix»), который нужно открыть или создать.
    • тип: строка;
  • create_if_missing — если 1, pmemkv пытается открыть пул и, если это не удаётся, создаёт его. Если 0, pmemkv будет полагаться на настройку флага create_*. Если оба флага create_* будут ложными, pmemkv откроет пул (если путь существует, иначе произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • create_or_error_if_exists — если 1, pmemkv создаёт файл (но произойдёт сбой, если путь существует). Если 0, pmemkv будет полагаться на настройку флага create_if_missing. Если оба флага create_* будут ложными, pmemkv откроет пул (если путь не существует, иначе произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • size — требуется только в том случае, если любой из вышеуказанных флагов равен 1. Указывает размер базы данных [в байтах], которую нужно создать.
    • тип: uint64_t.

Для более подробного описания конфигурации см. раздел cmap в libpmemkv(7).

Необходимые условия

Дополнительные пакеты не требуются.

stree

Постоянное, однопоточное и отсортированное ядро, поддерживаемое B+ деревом. Отключено по умолчанию. Может быть включено в CMake с использованием параметра ENGINE_STREE.

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

  • path — путь к пулу базы данных (формат «pmemkv_stree»), который нужно открыть или создать.
    • тип: строка;
  • create_if_missing — если 1, pmemkv пытается открыть пул и, если это не удаётся, создаёт его. Если 0, pmemkv будет полагаться на настройку флага create_*. Если оба флага create_* будут ложными, pmemkv откроет пул (если путь существует, иначе произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • create_or_error_if_exists — если 1, pmemkv создаёт файл (но произойдёт сбой, если путь существует). Если 0, pmemkv будет полагаться на настройку флага create_if_missing. Если оба флага create_* будут ложными, pmemkv откроет пул (если путь не существует, иначе произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • size — требуется только в том случае, если любой из вышеуказанных флагов равен 1. Указывает размер базы данных [в байтах], которую нужно создать.
    • тип: uint64_t.

Для более подробного описания конфигурации см. раздел cmap в libpmemkv(7).

Внутреннее устройство

(TBD)

Необходимые условия

Дополнительные пакеты не требуются.

robinhood

Постоянное и параллельное ядро, поддерживаемое хеш-таблицей с хешированием Робин Гуда (некоторое представление об алгоритме). Использует только ключи и значения фиксированного размера (8 байт). Отключено по умолчанию. Может быть включено в CMake с использованием параметра ENGINE_ROBINHOOD.

Есть два параметра, которые можно дополнительно изменить с помощью переменных среды:

  • PMEMKV_ROBINHOOD_LOAD_FACTOR — коэффициент загрузки для указания порога изменения размера;
  • PMEMKV_ROBINHOOD_SHARDS_NUMBER — количество сегментов в ядре.

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

  • path — путь к пулу базы данных (формат «pmemkv_robinhood»), который нужно открыть или создать.
    • тип: строка;
  • create_if_missing — если 1, pmemkv пытается открыть пул и, если это не удаётся, создаёт его. Если 0, pmemkv будет полагаться на настройку флага create_*. Если оба флага create_* будут ложными, pmemkv откроет пул (если путь существует, иначе произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • create_or_error_if_exists — если 1, pmemkv создаёт файл (но произойдёт сбой, если путь существует). Если 0, pmemkv будет полагаться на настройку флага create_if_missing. Если оба флага create_* будут ложными, pmemkv откроет пул (если путь не существует, иначе произойдёт сбой).
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • size — требуется только в том случае, если любой из вышеуказанных флагов равен 1. Указывает размер базы данных [в байтах], которую нужно создать.
    • тип: uint64_t. ### Предпосылки

Дополнительные пакеты не требуются.

pskiplist

Постоянный и параллельный движок, поддерживаемый списком пропуска, реализованным с использованием Persistent Compare and Swap (PCAS), предоставленным 4Paradigm Inc.. Структура данных списка пропуска впервые представлена в статье VLDB ("Оптимизация механизма базы данных в памяти для интеллектуального онлайн-дополнения решений с использованием постоянной памяти". Чен Чен, Цзюнь Ян, Мянь Лу, Тайцзе Ван, Чжао Чжэн, Юйцян Чен, Вэньюань Дай, Биншэн Хэ, Уэн-Фай Вонг, Гоань Ву, Юпинг Чжао, Энди Рудофф). Его можно включить в CMakeLists.txt с помощью опции ENGINE_PSKIPLIST.

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

  • path — путь к файлу базы данных (макет «pmemkv_stree»).
    • тип: строка;
  • force_create — если 0, pmemkv открывает файл, указанный в 'path', в противном случае он создаёт его.
    • тип: uint64_t;
    • значение по умолчанию: 0;
  • size — требуется только тогда, когда force_create не равно 0, указывает размер базы данных [в байтах].
    • тип: uint64_t.

Внутреннее устройство

(TBD)

Предпосылки

Дополнительные пакеты не требуются.

Связанная работа


pmse

tree3 имеет много общего с pmse — обе реализации внутренне полагаются на PMDK, хотя внешне они предоставляют разные API. И pmse, и tree3 основаны на реализации B+ дерева. Самое большое различие заключается в том, что дерево pmse хранит внутренние и листовые узлы в постоянной памяти, а tree3 хранит внутренние узлы в DRAM, а листовые — в постоянной памяти. (Это означает, что tree3 должен восстанавливать все внутренние узлы при запуске движка).

FPTree

В этой исследовательской статье описывается гибридная конструкция дерева DRAM/NVM (похожая на механизм хранения tree3), но в этой статье нет кода, и она опускает некоторые важные детали реализации.

Помимо предоставления чистой реализации, дизайн tree3 отличается от FPTree в нескольких важных областях:

  1. tree3 написан с использованием привязок C++ PMDK, которые влияют на его дизайн и реализацию. tree3 использует общие транзакции PMDK (т. е. замыкания transaction::run()), нет необходимости в структурах микрологирования, как описано в статье FPTree, чтобы сделать внутренние операции удаления и разделения безопасными. tree3 также корректирует размеры структур данных (чтобы соответствовать примитивным типам PMDK) для оптимальной оптимизации кэш-строки.
  2. FPTree не определяет реализацию метода хеширования, в то время как tree3 использует хэш Пирсона (RFC 3074).
  3. В своих постоянных листьях FPTree использует массив хеш-ключей с отдельной битовой картой видимости для отслеживания того, какие слоты хеша заняты. tree3 придерживается другого подхода и использует сами хеш-ключи для отслеживания видимости. Это зависит от специально модифицированной функции хэширования Пирсона, где нулевое значение хеш-функции всегда указывает на то, что слот не используется. Эта оптимизация устраняет затраты на использование и обслуживание битовых карт видимости, а также позволяет разместить больше хешей в одной кэш-линии и влияет на реализацию каждой примитивной операции в дереве.
  4. tree3 кэширует хеш-ключи в DRAM (в дополнение к их хранению в виде части постоянного листа). Это ускоряет операции с листьями, особенно на более медленных носителях, что кажется приемлемым увеличением использования DRAM.
  5. В своих постоянных листах tree3 объединяет хеш, ключ и значение в один тип слота (KVSlot). Это приводит к улучшенной производительности разделения листьев и снижению усиления записи, поскольку разделение может быть выполнено путём замены указателей на слоты без копирования каких-либо данных ключа или значения, хранящихся в слотах. KVSlot внутренне сохраняет ключ и значение в одном постоянном буфере, что минимизирует количество постоянных выделений и повышает эффективность хранения с большими ключами и значениями.

cpp_map

Использование привязок PMDK C++ в tree3 было заимствовано из этого примера программы. Большое спасибо @tomaszkapela за предоставление отличного примера для подражания!

Архивированные движки

caching

Он присутствовал в выпусках <=

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/paradigm4-pmemstore.git
git@api.gitlife.ru:oschina-mirror/paradigm4-pmemstore.git
oschina-mirror
paradigm4-pmemstore
paradigm4-pmemstore
master