Cachelot.io

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:28, 12 июня 2019.
Cachelot.io
Cachelot logo.png
Создатели: Iurii (Yuriy) Krasnoshchok
Разработчики: Iurii (Yuriy) Krasnoshchok
Выпущена: 4 April 2015
Написана на: C++
Операционная система: Alpine Linux, CentOS, Ubuntu Trusty, macOS, FreeBSD
Локализация: Английский
Лицензия: BSD лицензия
Веб-сайт cachelot.io

Cachelot — библиотека, работающая с фиксированным количеством предварительно выделенной памяти. Разработана Юрием Краснощеком, выпущена в 2015 году. Основная функциональность библиотеки - это работа с кэшем в пределах фиксированного объема памяти. Память выделяется один раз при инициализации, и потом только используется снова.

Библиотека используется тогда, когда приложению требуется быстрое LRU кэширование. Способна утилизировать до 98% выделенной памяти. То есть всего 2% памяти будет использовано на выравнивание и метаданные аллокатора. Помимо этого этого Cashelot обеспечивает плавное выполнение для операций чтения и записи. Также может исполнять роль согласованного кэша, возвращая ошибку при нехватке памяти или освобождать пространство от старых элементов для новых.

Код библиотеки написан на языке C++ Можно использовать библиотеку, либо сервер Cachelot как на портативных IoT устройствах, так и на мощных серверах с огромным количеством оперативной памяти.

Библиотека Cachelot предоставляет интерфейс на языке C, и теоретически может использоваться практически в любом языке программирования (при наличии "прослойки"): Python, Go!, JavaScript в Node.js, .NET, ColdFusion, Erlang, Java, Lisp, Lua, OCaml, Perl, PHP, Ruby. Библиотека может работать в режиме кэширования: выбрасывать старые элементы, если выделенная память закончилась при добавлении новых, либо в режиме консистентного хранилища - возвращать ошибку в подобной ситуации. Функциональность Cachelot копирует Memcached, поддерживая все его операции: add, get, set, append, prepend, cas, del.

Сервер Cachelot написан на С++ с использованием Boost asio, и совместим с Memcached по текстовому протоколу; может выступать прямой заменой Memcached.[Источник 1].

Cashelot как распределенный кэш-сервер

Часто встает задача выбора ПО для кэшерования данных. Не задумываясь, можно выбрать Memcached, но не стоит забывать о Cashelot, который намного лучше использует оперативную память, из-за чего появляется возможность хранения большего количества элементов при том же объеме памяти. Также он быстрее с точки зрения задержки, что показывают тесты на веб-сайте разработчика [Источник 2].

Результаты Benchmark'ов Memcached и Cashelot

Cashelot однопоточен, может масштабироваться до 1024 ядер и работать на устройствах с батарейным питанием. Поддерживает сокеты TCP, UPD и UNIX.

Особенности реализации

Высокая скорость работы Cachelot достигается за счет использования структур данных и алгоритмов, оптимизированных для работы с кэшами современных процессоров. Основное хранилище данных в Cachelot - хэш таблица реализует алгоритм Robin Hood Hashing [Источник 3].

Cachelot использует свой собственный менеджер памяти, который разбивает всю доступную память на "куски", размер которых является степенью двойки: 256, 512, 1024, 2048 ... <page_size> байт. Дополнительно, каждый из "кусков" разбит на "блоки" числом N (N - тоже степень двойки), так что при N=32 размеры блоков выглядят как: 256, 264, 272, 280, 288, 296 ... 512, 528, 544, ... allocation_limit. Например, когда пользователь запрашивает 260 байт памяти, аллокатор выбирает ближайший блок - 264 байта. Если свободных блоков размером 264 байт нет в наличии, то аллокатор будет пробовать разбить блок большего размера, или объединить соседние блоки меньшего размера. Использование степеней двойки в качестве размеров блоков помогает заменить дорогую для процессора операцию деления битовым сдвигом. Фиксированный размер блоков помогает бороться с фрагментацией памяти - блоки меньшего размера объединяются в блоки большего размера без остатка.

Единицей LRU в Cachelot является "страница" памяти - настраиваемый параметр (по умолчанию 1Mb). Каждый раз, когда вся доступная память использована, а пользователь пытается добавить новый элемент, Cachelot может "вытеснить" страницу, чтобы освободить память для нового элемента. При этом, все элементы, аллоцированные внутри этой страницы будут потеряны. Алгоритм LRU вытеснения Cachelot неточный - он может потерять только что добавленный элемент, если ему (элементу) не повезло, и он оказался в редко используемой странице, но зато алгоритм имеет амортизированную константную сложность O(1). Если выбрать маленький размер страницы, то это повысит качество работы LRU. При этом нужно учитывать что в Cachelot нельзя добавить элемент больше, чем размер одной страницы. Т.е. если планируется использовать Cachelot для объектов размером 2Mb, то размер страницы должен быть минимум 2Mb, или 4Mb с запасом [Источник 4].

Установка

Для установки можно пользоваться Docker, например:

docker run - - net = host cachelot/cachelot

Или при помощи консоли:

1. Клонируем исходный код Cashelot:

$ git clone https://github.com/cachelot/cachelot.git

2. Переходим в рабочий каталог cachelot:

$ cd cachelot

3. Создаем файлы для среды IDE или Makefile, выполнив команду в корневом каталоге Cashelot

$ cmake-G"{target}"

Например:

$ cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release && make

Источники

  1. Cachelot.io vs. Memcached vs. Redis [Электронный ресурс] : Материал из https://db-engines.com: — Режим доступа: https://db-engines.com/en/system/Cachelot.io%3BMemcached%3BRedis
  2. Official web-site [Электронный ресурс] : Материал из https://cachelot.io/: — Режим доступа: https://cachelot.io/
  3. Robin Hood Hashing [Электронный ресурс] : Материал из https://www.sebastiansylvan.com: — Режим доступа: https://www.sebastiansylvan.com/post/robin-hood-hashing-should-be-your-default-hash-table-implementation/
  4. Github [Электронный ресурс] : Материал из https://github.com: — Режим доступа: https://github.com/cachelot/cachelot