Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

Каждому сервису - крейсерный ход

Денис Колисниченко

Хакер, номер #093, стр. 093-114-3


[индеец на стероидах]

Как и у сервера ProFTPD, у Apache есть директива MaxClients, определяющая максимальное количество клиентов, которые могут одновременно работать с сервером. Это не просто число клиентов, это еще и число Апачей, одновременно запущенных на твоем сервере (то есть одному соединению соответствует своя копия Апача). Представь, что ты установил значение "30", а зайти на твой сайт (одновременно имеется в виду) пытаются, скажем, сразу 35 пользователей. Выходит, 5 пользователей окажется "за бортом". С другой стороны, если ты установишь значение с большим запасом, скажем, "150" или даже "200", а на твой сайт одновременно заходят только 5-10 человек, то это будет непростительным расточительством системных ресурсов. Зачем тебе 190 индейцев-бездельников? Они только съедят драгоценные системные ресурсы (процессорное время, оперативную память). Поэтому нужно определить максимальное число пользователей, которое когда-либо находилось на твоем сервере одновременно. Это можно сделать с помощью программы WebAlizer или любого форума, например, PHPBB.

Но кроме MaxClients есть еще и другие директивы управления производительностью. Например, StartServers, MaxSpareServers, MinSpareServers. Как уже отмечалось выше, для каждого нового соединения создается новая копия процесса сервера. Директива StartServers задает такое количество копий, которое будет создано при запуске исходной копии сервера. При этом исходная копия сервера получает запросы и передает их свободным копиям. Это позволяет равномерно распределить нагрузку между отдельными процессами и повысить производительность сервера. Однако на практике все не так хорошо, как хотелось бы. Существенного прироста производительности можно добиться только в случае большой загрузки сервера. По умолчанию запускается пять копий сервера.

Если число поступающих запросов превышает количество запущенных копий сервера, запускаются дополнительные процессы-серверы. Эти процессы не завершаются после обработки своего запроса, а продолжают висеть в памяти. Директива MaxSpareServers позволяет указать максимальное число таких процессов. Если это количество превышено, то лишние процессы завершаются. Если количество "серверов на подхвате" меньше, чем задано директивой MinSpareServers, запускаются дополнительные копии. Для работы этих директив необходимо, чтобы сервер был запущен в автономном режиме.

Директива Timeout задает промежуток времени в секундах, в течение которого сервер продолжает попытки возобновления приостановленной передачи данных. Значение директивы Timeout распространяется не только на передачу, но и на прием данных. Если требуется передавать большие файлы, следует увеличить данное значение. Но если у тебя самый обычный Web-сервер, на котором не лежат ISO-образы последних дистров, фильмы и прочие тяжеловесные файлы, можно уменьшить значение таймаута до 30 секунд (по умолчанию оно равно 300 секунд).

Немного повысить производительность могут KeepAlive-соединения - так называемые постоянные соединения. Схема обычного соединения: подключились, отправили запрос, получили ответ, отключились. А вот в случае с постоянными соединениями за одно соединение можно отправить несколько запросов и получить ответы. Поскольку процедура подключения/отключения для каждого запроса отсутствует, это позволяет повысить производительность. Включить постоянные соединения можно за счет директивы KeepAlive, а с помощью KeepAliveTimeout установить таймаут для постоянного соединения (рекомендуемое значение 10-20 секунд).

Назад на стр. 093-114-2  Содержание  Вперед на стр. 093-114-4