«Бегун» открыл код многопоточного HTTP-сервера и аллокатора памяти
20 апреля 2011 года
Сервис контекстной рекламы "Бегун" объявил об открытии исходных текстов четырёх проектов: многопоточного 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 Кб) кэшируется аллокатором и никогда не возвращается обратно операционной системе.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.