...
...
...

Обзор веб-сервера 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 большинства программных продуктов.

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


© Сетевые решения