Обзор веб-сервера Boa

Boa представляет собой «однозадачный» HTTP-сервер. Boa не создает собственных копий (fork) и не порождает потоки для обеспечения каждого входящего соединения, однако он мультиплексирует соединения внутри себя. Boa разветвляется только для обслуживания CGI-программ, автоматической генерации директорий, а также автоматического извлечение файлов из архивов — операций, каждая из которых так или иначе должна быть отдельным процессом. Основные достижения системы Boa — это безусловно скорость и безопасность, в смысле того, что он "не может быть скомпрометирован конкретным пользователем", а не "обеспечивает полномасштабный контроль доступа и шифровку коммуникаций". Boa не является богатым на возможности, многофункциональным сервером, так что, если вам нужен именно такой — Boa скорее всего не будет правильным выбором.

что такое Boa?
Boa написан на языке C и использует систему GNU autoconf для обеспечения портируемости кода. По многим свидетельствам, он вчистую переносится на различные модификации UN*X, а также с минимальными переделками — на многие другие системы. В данный момент Boa разрабатывается на платформе Linux — для многих ее дистрибутивов, из которых наиболее известны RedHat Linux, Debian GNU/Linux и Gentoo Linux. Дополнительно, Boa доступен под FreeBSD 4.6 как порт. Также сервер способен работать на OpenBSD, HP/UX, Solaris 7 и 8, AIX, и даже в Cygwin-окружении для Windows. Более того, ранние версии Boa были портированы даже под DOS!
Boa выгодно отличается от других подобных продуктов лишь в некоторых задачах, например, в работе со статичными документами (документами, которые просто выдаются с диска без вовлечения в процесс дополнительных программ). Несмотря на то, что Boa был создан еще до появления 100-мегабитного Ethernet, он легко может обслуживать 100 мегабитные линки, при этом на достаточно скромном железе. Изначально Boa был нацелен на эффективное использование ресурсов. Интересно и то, что Boa на данный момент является одной из наиболее старых веб-серверных разработок, активный процесс модернизации которой продолжается и по сей день!

история
Boa был создан Полом Филипсом где-то в начале девяностых. Если быть более точным, первое сообщение, которое я смог найти по поводу Boa, датируется 20 сентября 1995, и в нем Пол анонсирует версию v0.90 "веб-сервера Boa''. К сожалению, я не смог обнаружить никаких сообщений, датированных более ранним числом, несмотря на то, что совершенно точно Boa был в разработке задолго до этой даты. Вскоре после этого вышла в свет версия 0.91.
В 1996 я обнаружил Boa во время своих поисков облегченного http-сервера, который подошел бы следующим строгим критериям: он должен был быть способен работать на том скромном железе, которым я располагал, а также у меня должна была быть возможность иметь доступ к исходному коду для того, чтобы как минимум быть в курсе того, что происходит. Оборудование, которым я располагал на тот момент, был Zeos Intel i386 с 2Мб RAM и 120Мб очень медленного дискового хранилища. После некоторых первоначальных изысканий, я скачал и попробовал использовать несколько серверов, включая Apache, NCSA, thttpd и Boa (версии 0.91). Я не смог заставить Apache работать в нужном мне ключе, при этом ощущалось, что он немного “тяжеловат” для того железа, которое у меня имелось. NCSA работал очень медленно, а с thttpd и Boa у меня зачастую возникали различные ошибки. Я решил исправить эти ошибки, но так и не смог разобраться в исходном коде thttpd. Когда же я обратил внимание на Boa, то сразу же проникся изяществом и несложностью кода. Через некоторое время мои попытки исправить неполадки завершились успехом, и я написал Полу Филипсу. Он ответил мне, рассказав о том, что два других энтузиаста обратили внимание на версию 0.91, продолжили работу и выпустили версию 0.92, которую он сам еще не видел. Я принял к сведению ту информацию, которой Пол снабдил меня, и связался с Ларри Дулитлом. Поначалу я разработал патч-другой, а затем, мало-помалу, увлекся этим проектом весьма основательно.
Версия 0.92 была следующим крупным релизом, и первой разработкой программы, в которой не принимал участия сам Пол. Ее разработкой занимался Ларри Дулитл. Эта версия прошла через несколько доработок и датой ее “официального” выхода стало 23 декабря 1996 года, финальная версия продукта получила номер 0.92o. После этого было некоторое количество версий, включающих небольшие дополнения, выход которых окончательно прекратился с выпуском версии 0.92q. Сегодня можно найти множество вариаций 0.92, работающих на различном оборудовании и в различном программном окружении.
Версия 0.93 вышла практически сразу же, и на протяжении достаточно долгого промежутка времени (более четырех лет) расценивалась как «development»-версия программы. В конце концов, 17 января 2000 года появилась версия 0.94, которая, как повелось, также имела некоторое количество всевозможных вариаций, но в конце концов приобрела достаточно четкий вид.
0.94 представляет собой огромный кусок проделанной работы, несколько сотен часов, проведенных за отладкой программы — в результате чего мы имеем достаточно быстрый, несложный и весьма надежный веб-сервер.

производительность

что означает понятие “высокая производительность”?
В контексте веб-серверов, понятие “высокопроизводительный” подразумевает низкий уровень задержек и высокую пропускную способность. Для некоторых видов документов Boa способен соответствовать вышеозначенным критериям более чем успешно. Работая на системах и оборудовании, описанных ниже, Boa поддерживает уровень задержек на отметке в 425 мс, и это при достаточно тяжелой нагрузке (когда клиент и серверы работают на процессоре Duron 700, используются сетевые карты RealTek rtl8139 10/100 с концентратором). А это весьма неплохо, друзья мои. Вдобавок, он обеспечивает низкую задержку при вполне высокой пропускной способности, обычно без проблем обслуживая 100-мегабитные соединения, вне зависимости от размера файла или количества одновременных соединений.
а как насчет потребления ресурсов?
У Boa минимальные системные требования. Размер «голого» бинарника для Linux, созданного с использованием gcc 2.95.3 и GNU libc 2.2.5 — всего 61K (495K с учетом статически прилинкованных библиотек). Используя такую библиотеку, как uClibc, Boa может стать гораздо меньше — 92К. Кроме того, у него весьма низкие требования к памяти. Таким образом, Boa идеален для использования на не слишком мощных машинах. В частности Boa очень хорошо подходит для рынка встроенных систем, и сегодня может быть обнаружен на многих устройствах (включая ThinkNIC и линейку веб-камер Axis). Ларри Дулитл также успешно использовал Boa на достаточно скромном оборудовании — миниатюрном 200 Мгц устройстве StrongARM размером с кредитную карточку. Также Boa засунули в "самый маленький в мире веб-сервер'', расположенный в Стэнфордском университете.
Мое нынешнее железо, состоящее из AMD Duron 700, 384Мб RAM, сетевых карт RealTek 8139 и SiS900, концентратора LinkSys 10/100, и Linux 2.4, вполне можно считать системой среднего уровня. Для Boa, надо сказать, данная конфигурация весьма подходит. Размер VmSize Boa на этой рабочей станции на данный момент составляет 1696Кб, 85% из которых — библиотеки. Размер VmData — 108 Кб. Boa требует примерно 20Кб памяти на каждое одновременное соединение. Таким образом, при полной нагрузке в, к примеру, 500 одновременных соединений, Boa потребует (1700 + 20 * 500) = 11700 == приблизительно 12Мб оперативной памяти. Определение объема потребляемой Boa памяти при статическом линковании библиотек оставляю на долю читателя (для этого следует определить потребление памяти в "состоянии покоя'' и добавить приблизительно 20 Кб на активное соединение).

В качестве примера того, как Boa использует ресурсы, приводим нижеследующую таблицу.

Сервер     Stripped  Binary Size     VmSize     Внешние библиотеки
Boa 0.94.    1361Кб     1700Кб0
Apache 1.3.26     277Кб 11,000Кб     9
thttpd 2.20c     64Кб     1800Кб     0

Over-the-Wire производительность
Самое последнее пополнение моего железа — это две карты Netgear GA-302T Gig-E. При помощи этих карт, на том же оборудовании, у меня получилось достичь впечатляющих результатов:
Результаты запуска "ZeusBench'' с размером файла в 105165 байт, 215-ю одновременными соединениями и использованием 10000 fetches:
Server: Boa/0.94.14rc5
Document Length: 105165
Concurency Level: 215
Time taken for tests: 24.748 seconds
Complete requests: 10000
Failed requests: 0
Keep-Alive requests: 10002
Bytes transfered: 1064119164
HTML transfered: 1061744679
Requests per seconds: 404.07
Transfer rate: 42998.19 kb/s
Connnection Times (ms)
min avg max
Connect: 0 14 9029
Total: 388 526 9547
И результаты “apache bench”:
Concurrency Level: 215
Time taken for tests: 23.298 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Keep-Alive requests: 10001
Total transferred: 1063465974 bytes
HTML transferred: 1061094751 bytes
Requests per second: 429.22 [#/sec] (mean) 
Time per request: 500.91 [ms] (mean) 
Time per request: 2.33 [ms] (mean, across all concurrent requests) 
Transfer rate: 45646.23 [Kbytes/sec] received

Цифры свидетельствуют о том, что я был в состоянии достичь 43-45% максимальной теоретической пропускной способности канала Gig-E. Также при этом прошу заметить, что обе Gig-E карты имели MTU по 1500 байт исходя из того, что автор был не в состоянии достать карты с 9000 Jumbo Frame MTU. Помните также, что как ZeusBench, так и ApacheBench — всего лишь единовременные отдельные процессы, а следовательно они не в состоянии в точности отражать “настоящую” загрузку машины, которая обычно происходит при участии нескольких несвязанных машин. 
К слову, я получал много откликов от людей, которые описывали то, как Boa помог им снизить загрузку собственных серверов. Один администратор рассказывал, как он разгрузил свои основные серверы Apache от 200-300 соединений до 10-20 при помощи обслуживания статичного контента специально выделенными для этого серверами Boa.
заключение

как измеряется производительность?
Для приблизительных данных по емкости и пропускной способности я запускаю приложения для измерения производительности через localhost. Так как эти тесты не дают точного представления о поведении сервера «в реальном мире», я запускаю большинство тестов через 100-Мбитный Ethernet (или свой новый Gig-E LAN).
Я использую zb (ZeusBench, исходный код которого стал основой для ab, ApacheBench) для основных своих тестов. Для быстрых, одноразовых тестов, я запускаю zb с сохранением значений определенных параметров, при этом изменяя другие параметры и отслеживая, как меняются от этого те или иные показатели. Это позволяет получить сравнительные данные от запуска к запуску.
Для того, чтобы хоть как-то автоматизировать процесс потенциальной тысячи запусков zb с изменением всего одного параметра за запуск, я написал python-оболочку для zb. Также я написал несколько gnuplot-программ, которые используют полученные данные, и в результате выдают наглядную картину того, насколько производительно работает веб-сервер при различном количестве одновременных соединений и различных размерах файлов. В результате вышло, что производительность Boa находится в обратно пропорциональной связи с увеличением двух вышеозначенных переменных. Это означает лишь то, что производительность Boa очень легко предсказать, зная заранее их значения.
взаимодействие с внешними процессами
Так как Boa является сервером общего применения, то он не содержит никакой специальной поддержки для иных, нежели HTTP/1.0 (впрочем, условная и экспериментальная поддержка HTTP/1.1 имеется в более поздних версиях Boa) и CGI/1.1 спецификаций. Таким образом, любой язык, который может использоваться в качестве CGI, будет работать без сбоев. В число таких языков входят, в частности, Python, Perl и PHP.
На данный момент непосредственной поддержки PHP не имеется, также как не существует аналогов mod_perl, mod_snake/mod_python или любым другим загружаемым модулям. Есть надежда, что будущие версии Boa будут их поддерживать, что сделает это веб-сервер более универсальным httpd.
Кто-то из энтузиастов Boa уже экспериментировал с непосредственным внедрением Perl или Python в Boa, но эти эксперименты на данный момент далеки от состояния, в котором их можно было бы смело демонстрировать широкой публике.
будущее
До появления 0.94 версии существовало несколько ответвлений Boa, которые включали в качестве эксперимента различные возможности, например, поточную обработку, поддержку виртуальных хостов (name based), аутентификацию и загружаемые модули. Вполне возможно, что уже существуют вполне рабочие версии с возможностями, которых пока нет в официальном варианте продукта. Также имеется некоторое количество запросов на включение в следующую версию продукта определенных возможностей, среди которых есть несколько таких, которые были внедрены в некоторых побочных версиях продукта. Я надеюсь, все они появятся в следующем релизе Boa — 0.95.0.
Многие люди спрашивают меня (возможно, и Ларри тоже), почему до сих пор не было релиза 1.0. Я не могу дать сколь-нибудь внятный ответ на этот вопрос, однако, скажу лишь то, что наша версия 0.94 гораздо лучше, чем версии 1.0 большинства программных продуктов.

Джон Нельсон, перевод Дениса Матвеева.



Сетевые решения. Статья была опубликована в номере 01 за 2003 год в рубрике software

©1999-2024 Сетевые решения