|
У любого успешного web-проекта
рано или поздно возникает проблема роста. Существующие программно-аппаратные
ресурсы перестают справляться с растущей нагрузкой. Универсальных
рецептов, к сожалению не существует. В каждом проекте хороший
программист будет программировать по-разному. Тем не менее,
в этой статье я попробую дать несколько типичных рекомендаций
по созданию больших web-проектов. Такие проекты в процессе
создания и развития сталкиваются, как правило, с двумя почти
противоположными по способам решения проблемами - большими
скоростями и большими объемами данных.
Большие скорости
В качестве идеального примера сайта, для которого жизненно
важна скорость, можно взять баннерную сеть. Итак, несколько
приемов для ускорения работы баннерных сетей и других серверов,
критичных к скорости работы.
Создание модулей
Смысл этого приема - вкомпилировать наиболее важные функции
в сервер. Идея очень проста. Если мы посмотрим на соотношение
времени, которое тратится на различные стадии выполнения запроса,
то увидим интересную картину. Например, при выполнении простейшего
perl-скрипта последовательно происходит следующее:

1) сервер Apache определяет perl-скрипт для запуска, подготавливает
и запускает его;
2) запуск скрипта фактически начинается с запуска perl-интерпретатора
(это файл, размером около полумегабайта). Perl-интерпретатор,
запустившись, размещается на 2-х мегабайтах в памяти машины,
и только после этого приступает к работе с пользовательским
скриптом;
3) эта работа начинается с компиляции программы. Компиляция
программы - это, как правило, один из самых длительных этапов
обработки программы;
4) только после предварительной компиляции (в байткод) скрипт
начнет выполняться.
Статистика удручает: время, которое тратится на запуск perl-интерпретатора
и компиляцию скрипта, как правило, на порядок больше времени,
за которое он выполняется.
На каждом сайте существуют узкие места - программы, которые
вызываются очень часто. Например, баннерный движок. Как правило,
на один просмотр страницы приходится два-три баннера, а значит
и вызова программы. Понятно, что если избавиться от накладных
расходов (пункты 2 и 3), работа сервера значительно ускорится.
Это можно сделать двумя похожими способами.
Первый - написать модуль к Apache и вкомпилировать его в сервер.
Именно так в баннерной сети Фламинго-2 (http://www.f2.ru),
в создании которой я принимал участие, была реализована часть
системы, которая раздавала баннеры пользователям. Это был
модуль, написанный на языке C, который функционировал как
часть сервера Apache и поэтому работал очень быстро.
|
Базы данных
Используйте хорошую базу данных. Какую выбрать?
Единого рецепта нет. Все зависит от решаемой задачи. Если
она достаточно простая и вам не требуется выполнять сложные
SQL-запросы (например, вложенные), то наилучшим решением будет,
пожалуй, база данных MySQL.
MySQL - один из самых простых серверов БД. Но даже в этой
простой базе есть свои способы оптимизации для ускорения запросов.
Например, не секрет, что INSERT - одна из самых длительных
операций (вычисление физического адреса для вставки, вставка,
решение проблемы фрагментации, изменение индексов и служебных
таблиц). Хороший прием для ускорения работы скрипта, который
вставляет данные в БД - замена операции INSERT операцией INSERT
DELAYED (отложенная вставка). Обновление данных будет выполнено
только тогда, когда это не приведет к замедлению работы сервера.
Другой пример: если внимательно почитать документацию MySQL,
можно найти упоминание о таблицах, расположенных в памяти
(HEAP tables). Очевидно, что операции с такими таблицами совершаются
значительно быстрее. Heap-таблицы можно использовать для решения
некоторых задач.
Существует большое количество параметров запуска сервера БД,
оптимизирующих буферы сортировки, вычислений, количество детей
и другие параметры. Как правило, вам заранее известно, что
вы будете делать с базой, и для повышения быстродействия можно
задать соответствующие параметры. Например, возьмем вполне
реальную задачу: построение какого-нибудь каталога. Ясно,
что это будет одна большая таблица с большим количеством индексов.
Вы знаете, что будете использовать представления. Работа с
этой таблицей будет заключаться в запросах по индексу без
использования сортировки. Посмотрим, как можно настроить сервер
БД на выполнение такой задачи (пример из MySQL 3.23.25):
*join_buffer_size - буфер для создания представлений,
по умолчанию равен 131072 байта;
*key_buffer_size - буфер для работы с ключами и индексами.
Размер по умолчанию - 1048540;
*sort_buffer - буфер для сортировки. По умолчанию - 2097116
байт.
Скорее всего, при увеличении какого-то буфера,
скорость выполнения связанной с ним задачи увеличится. Исходя
из нашей задачи, мы увеличим буфер для работы с ключами (скорость
выборки значений из таблицы увеличится), уменьшим буфер сортировки
(уменьшится скорость сортировки) и буфер представлений (уменьшится
скорость работы с представлениями).
Строка запуска демона MySQL будет выглядеть примерно так (конкретные
значения зависят от количества памяти в системе):
shell>safe_mysqld -O key_buffer=8M -O
sort_buffer=1M -O join_buffer=16K
Резюмируем. При использовании базы данных
работу скрипта можно значительно ускорить правильной настройкой
сервера БД. В руководстве базы данных MySQL есть специальный
раздел, посвященный оптимизации.
За более подробной информацией можно обратиться
на сайты:
Разработчики MySQL - http://www.mysql.com |
|