Автор статьи: Таксиков Александр
«Чаще зачеркивай написанное.» Гораций
Вообще речь пойдет о подходах к разработке и написанию программ в общих чертах, просто в качестве «примеров из жизни» будутрассматриваться эпизоды разработки программного обеспечения для ряда вебсайтов. В некоторых случаях я являлся наблюдателем (с правом давать толковые и бестолковые советы ;-), а в некоторых и собственно разработчиком.
Часто ли, разрабатывая и отлаживая программу для вебсервера, вы задумаетесь над тем, насколько быстро она будет работать? И ставите ли перед собой задачу разработки именно быстрой программы? Наверняка вас устраивает та задержка, с которой созданный скрипт выдает результат, возможно она вообще не заметна на общем фоне работы сайта. Но попробуйте стартовать одновременно 10 копий скрипта, а затем — 100 копий. Подтормаживание сервера стало заметным? Если нет, то вас можно поздравить.
Если посещаемость сайтов, размещенных на вашем сервере, постоянно растет, то рано или поздно возникнет проблема с перегруженностью компьютера. Можно значительно облегчить себе жизнь, если заранее потратить немного времени на оценку возможной загрузки машины и продумать пути ее минимизации. Те методы, которыми пользуюсь я, могут показаться очевидными, но на вооружение я взял их не сразу и не без посторонней помощи.
Главный мой совет начинающим разработчикам вебсайтов — не увлекайтесь cgi- скриптами. Наиболее распостраненный и популярный инструмент для cgi-программирования — язык Perl. Он имеет как минимум два (по крайней мере для меня) больших плюса — простота в изучении и удобный инструментарий работы со строками. Писать и отлаживать программы на нем — весьма приятное занятие, если вы конечно не избаловались Visual-системами и работа с командной строкой вас не пугает. Но при всех своих достоинствах у Perl один существенный недостаток — perl-программы не компилируются в машинный код, а выполняются интерпретатором. Т.е. прежде, чем программа начнет выполняться, система должна загрузить ядро интерпретатора, который проверит синтексис программы, скомпилирует ее во внутренний псевдокод и только потом начнет выполнять. Естественно весь этот процесс требует дополнительных затрат машинного времени и оперативной памяти. Конечно скрипты значительно облегчают жизнь и позволяют сделать сайт более динамичным, а в таких областях, как разработка чатов, конференций, гостевых книг, без них просто невозможно обойтись, но вот сократить ту нагрузку, которую скрипты дают серверу можно и весьма существенно. И лучше об этом позаботиться заранее, чем тогда, когда жареный петух начнет в одно
место клевать 🙂
Значительно облегчить жизнь вашему серверу можно заменив как можно большее число страниц, которые просматриваются путем вызова cgi-скрипта на статические html-страницы. Правда тогда процесс размещения информации будет более ресурсоемким. Но пусть лучше у вас будет более тяжелый скрипт, управляющий размещением информации на сайте, ведь количество таких событий, как обновление информации гораздо меньше, чем чтение ее посетителями. Например, ведущие вебсервера >«Быки и Коровы» выкладывают порядка 100-200 информационных блоков в день, а только к главной странице в будний день происходит свыше 15-17 тысяч обращений для чтения. Значительно облегчить и упростить процесс верстки страниц вам поможет использование SSI (Server Site Include), когда динамично меняющаяся часть размещается отдельным файлом и вставляется в html-страницу посредством ssi-инструкции. К тому же написать и отладить один скрипт всегда быстрее и проще, чем два примерно такого же объема.
Когда вы максимально облегчите ваш сайт путем замены ряда динамических страниц на псевдостатический html, займитесь оптимизацией скриптов. Один из способов — максимально отказаться от использования сервисных библиотек. Конечно, это не всегда возможно, но если вы не поленитесь и потратите немного времени на написание модулей, которые решают нужные вам задачи вместо библиотечных, результат будет весьма заметным. Самый яркий пример — CGI.pm для Perl. Объем этого модуля — около 150 килобайт! Лично я использую для получения cgi-переменных подпрограмму «весом» в 2000 байт. Средний размер используемых на bk.ru скриптов 5-7 килобайт. Несложно оценить величину выирыша от уменьшения обрабатываемого интерпретатором текста только за счет отказа от CGI.pm.
Еще один способ — использование в ряде «тонких» мест вместо Perl откомпилированную программу на C. Правда, такой вариант подразумевает неплохое знание этого языка. Но есть одна ситуация, когда такое знание практически не требуется, но пользу от такой замены тем не менее можно извлечь. Это генерация кода баннерной сети на вашем сайте с использованием предоставляемого данной сеткой скрипта. Как правило, в стандартный набор входят модули на Perl, C и модуль для вебсервера Apache. Если у вас есть возможность откомпилировать C-программу на том же сервере, где размещается и ваш сайт, то не поленитесь это сделать. Результат, как говорится, будет на лице. Есть конечно и более быстрый и эффективный по сравнению с вышеописанным способ ускорения работы сайта. Это пойти и купить более мощный компьютер 😉
Чтобы все вышеописанное не показалось голословным теоретизированием, приведу достаточно яркий пример проведенной оптимизации, в котором мне пришлось участвовать — сайт «Приколы Фоменко». На создание данного сайта (я имею в виду его внутреннюю механику работы) заметное вличние оказали два условия — размещение на мощном и малозагруженном сервере и увлечение разработчика Perl’ом. И я его понимаю. Сам, только освоив азы этого языка стал использовать его где надо и где не надо, пока меня не ткнули несколько раз носом в возникающие параллельно проблемы с нагрузкой. И спасибо, что вовремя. Так вот, когда «Приколы» перестали ютиться под чужими доменными именами, а обрели свое собственное (fomenko.ru) и переехали на один сервер с «Быками и Коровами», вот тут-то все и началось. Если до этого мощности сервера не были загружены и на половину, то теперь оказались перегружены, в несколько десятков раз выросла очередь ожидающих выполнения заданий. Сисадмин выхватил шашку и заявил, что если до конца рабочего дня проблема не будет решена, то он убирает сайт fomenko.ru с сервера, до которого при такой бешенной нагрузке почти невозможно было достучаться снаружи. К тому же все это происходило во второй половине дня пятницы и фактически только показавшись перед своими посетителями во всей красе собственного имени, «Приколы» вынуждены были как минимум на ближайшие три дня возвращаться в тень чужого. К счастью (и к чести разработчика сайта) надо отдать должное хорошо продуманной аккуратной внутренней структуре и размещению информации. Это позволило, используя отработанную на «Быках» технологию, быстро произвести требуемые изменения и выправить сложившуюся ситуацию. Виновником возникших проблем оказался маленький perl-скрипт, формирующий отдельные фрагменты страниц сайта, вызываемый посредством ssi-инструкций при каждом обращении к какой-либо html-странице. Его достаточно безболезненно удалось заменить на аналогичные ssi-инструкции, которые на этот раз обращались напрямую к текстовым фрагментам. На момент написания данной статьи посещаемость Fomenko.ru выросла более чем в полтора раза и продолжает расти, да и «Быки» не стоят на месте. Однако высвободившиеся, благодаря проведенной оптимизации, ресурсы позволяют не беспокоиться на этот счет, резерв еще достаточен.
А вот не менее драматический пример от ведущего Pro.Net.ru, Станислава Жаркова: «Как-то я написал для каталога программ SoftList cgi-скрипт, рассылавший файлы этих самых программ по e-mail. Сисадмин, увидев этот скрипт в работе, прямо-таки затрясся от гнева. Оказалось, что Perl-функция кодирования файла в base64 (это необходимо для присоединения его к письму в виде аттачмента) загружала сервер на 99% (а нужно сказать, что на той же машине тогда размещались все проекты List.ru, кроме самого Листа и рейтинга, то есть нагрузка и без того была очень неслабая)! Да, шухер я тогда навел приличный: К счастью, Максим Зотов, автор рейтинга ТопЛист быстренько прислал мне пример того, как из Perl-скрипта вызвать внешнюю функцию кодирования, написанную на Си и, соответственно, гораздо менее ресурсоемкую. Правда, через несколько месяцев я этот скрипт с сервера все равно убрал — рассылка программ не привлекла на сайт ожидаемого числа посетителей. Но это, как говорится, уже совсем другая история :).»