В рамках проекта Lwan развивается новый высокопроизводительный HTTP-сервер
Бразильский разработчик Леандро Перейра (Leandro Pereira) из Intel Open Source Technology Center развивает новый легковесный HTTP-сервер Lwan, нацеленный на минимальное потребление ресурсов и поддерживающий отдачу как статического, так и динамического контента. Lwan можно использовать обособленно или в форме встраиваемой библиотеки. Разработка Lwan началась четыре года назад в форме персонального исследовательского проекта, нацеленного на изучение методов многопоточной обработки данных и неблокирующего ввода. Код проекта написан на языке Си и распространяется под лицензией GPLv2+. Официально поддерживается работа только в Linux, поскольку обработка событий завязана на механизм epoll (имеется неофициальный порт для FreeBSD/kqueue).
Сервер включает встроенный движок-шаблонизатор Mustache, поддерживает подключение обработчиков контента, написанных на языках Си и Lua, и предоставляет API для разработки интегрированных с HTTP-сервером web-приложений и для создания дополнений, расширяющих возможности HTTP-сервера. Lwan поддерживает протоколы HTTP/1.0, HTTP/1.1 (с поддержкой keep-alive и pipelined) и PROXY, для перенаправления запросов применяется сопоставление по шаблонам Lua.
Для асинхронной обработки соединений используются сопрограммы, выполнение которых координируется встроенным планировщиком совместной многозадачности, что позволяет создать иллюзию блокирующего ввода/вывода для обработчиков запросов. Сервер обеспечивает минимальное потребление памяти и минимизирует число системных вызовов, операций копирования и распределения памяти. Например, для 10 тысяч ожидающих обработки соединений расходуется около 500 Кб ОЗУ. Размер исполняемого файла составляет 110 Кб.
В зависимости от размера файла выбирается оптимальный метод его отдачи, например, для файлов больше 16 Кб не используется прямая отдача без промежуточного копирования в пространство пользователя, а для небольших файлов применяется векторизированный ввод/вывод с задействованием отражённых через mmap буферов.