"Бегун" открыл код многопоточного HTTP-сервера и аллокатора памяти

Сервис контекстной рекламы «Бегун» объявил об открытии исходных текстов четырёх проектов: многопоточного HTTP-сервера Lizard, библиотеки с реализацией HTTP-сервера Serverlib, библиотеки для обработки реплицированных данных MySQL libslave и оптимизированной для многопоточных систем реализации функций malloc/free lockfree-malloc. Код проектов написан на языке C++ и распространяется в рамках лицензии LGPLv3.

  • Lizard не похож на классические http-серверы двумя вещами: Во первых, обслуживающее web-запросы приложение оформлено в виде плагина, который не вызывается через интрейфейс подобный FastCGI, а непосредственно линкуется с Lizard. Допускается как динамическая загрузка плагина, так и статическое связывание, при котором приложение и http-сервер составляют единый исполняемый файл. Lizard берёт на себя обеспечение обработки протокола HTTP и вызывает обработчики событий, определенные в плагине.

    Второй особенностью Lizard является поддержка двух логически разделённых пулов потоков-обработчиков соединений: первый пул («easy») обрабатывает запросы, на которые ответ может быть отдан быстро (например, из кэша), а второй пул («hard») обслуживает ресурсоёмкие запросы, например, требующие обновления данных в кэше. Запросы к обоим пулам обслуживаются в порядке очереди, размер которой ограничен конфигурацией (запрос отбрасывается, если все позиции в очереди заняты, что позволяет избежать перегрузки сервера). Запросы вначале всегда попадают в easy-пул и в зависимости от логики реализации плагина могут быть переданы по цепочке в hard-пул.

    Конфигурация Lizard задается в XML-формате и отличается наличием всего нескольких базовых директив: IP и порт для обслуживания запросов, таймауты, ограничение на размер и число очередей, параметры ведения логов, путь к динамической библиотеке с выполняемым плагином. В плагине реализуется несколько циклически вызываемых обработчиков запросов: handle_easy для первичной обработки запросов в easy-пуле; handle_hard для выполнения более ресурсоёмких операций; set_param — вызываемый при старте сервера callback-обработчик для разбора собственного файла конфигурации плагина; idle — вызываемая через заданные промежутки времени функция для выполнения типовых периодических действий.

  • Serverlib представляет собой оформленный в виде библиотеки многопоточный http-сервер, который можно встроить в любое приложение на языке C++. В отличие от усложненных многофункциональных HTTP-фреймворков библиотека Serverlib крайне проста в использовании: функциональность доступа через несколько простых функций. Запуск встроенного http-сервера сводится к вызову трёх функций: перевод процесса в фоновый режим, прикрепление к сокету и начало обработки соединений.

    Обработка запроса производится в цикле и по организации работы напоминает FastCGI. Библиотека оптимизирована для 64-разрядных Linux-систем и уже достаточно давно используется в промышленной эксплуатации для обработки тысяч соединений в секунду.

  • Libslave — библиотека для анализа выполнения репликации данных в СУБД MySQL. Позволяет из C++ программы присоединиться к первичному (master) MySQL-серверу и выполнить чтение и разбор используемых в процессе репликации бинарных логов. Т.е. библиотека позволяет создать приложение, которое не связано с кодом MySQL, но действует как вторичный (slave) MySQL-сервер, на который производится передача реплицированных данных. Из областей применения называется возможность создания обработчиков поступающих в базу изменений, получающих данные в режиме реального времени без привлечения промежуточных хранилищ.
  • lockfree-malloc — оптимизированная для многопоточных приложений система распределения памяти, способная заменить стандартные функции malloc и free.

    Достоинства lockfree-malloc:

    • Пригодность для использования в многопоточных программах, поддержка практически неограниченного числа одновременно работающих нитей без падения производительности из-за блокировок;
    • Высокая эффективность в многопоточном окружении: lockfree-malloc значительно опережает по производительности систему распределения памяти libc;
    • В отличие от libc в Lockfree-malloc никогда не выделяются фрагментированные области памяти, что позволяет свести к минимуму утечки памяти;
    • Низкий расход памяти, для объектов размером до 8 Кб при хранении полностью отсутствуют накладные расходы;
    • Оптимизация для работы на 64-разрядных системах;
    • Реализация библиотеки занимает всего 800 строк кода;
    • Автономность, библиотека не зависит в процессе работы от других библиотек, таких как pthreads и libc.

    Недостатки lockfree-malloc:

    • Работа только на процессорах с архитектурой x86_64;
    • Библиотека не пытается экономить области маппинга виртуальной памяти;
    • Используемая для хранения небольших объектов память (до 128 Кб) кэшируется аллокатором и никогда не возвращается обратно операционной системе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.