«Бегун» открыл код многопоточного 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 Кб) кэшируется аллокатором и никогда не возвращается обратно операционной системе.

Источники

править


 
 
Creative Commons
Эта статья содержит материалы из статьи ««Бегун» открыл код многопоточного HTTP-сервера и аллокатора памяти», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots в архив и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.