Обычно после покупки VPS наступает период эйфории – много ресурсов, много возможностей, по сравнению с виртуальным хостингом все работает быстро и хорошо. Но через некоторое время, по мере роста сайта, возникают проблемы. Чаще всего они выражены в нехватке оперативной памяти, либо в низкой скорости отклика сайта на действия пользователей. Не стоит сразу переходить на более высокий тариф, можно попробовать настроить Apache под свои нужды.
Для настройки нам понадобится файл httpd.conf, который расположен тут – etc/httpd/conf/.
Открываем – смотрим – видим:
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to “Off” to deactivate.
#
KeepAlive off#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 15##
## Server-Pool Size Regulation (MPM specific)
### prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 5
ServerLimit 10
MaxClients 10
MaxRequestsPerChild 4000
</IfModule>
Разберем по-порядку настройки.
KeepAlive – держит TCP-подключении открытым и позволяет делать несколько запросов от одного и того же клиента. Если стоит off, то для каждой страницы и картинки на ней будет создаваться свое подключение, что является явно лишней нагрузкой для сервера. Для динамических страниц на мой взгляд просто необходимо его включить.
MaxKeepAliveRequests – количество запросов в 1 соединении.
KeepAliveTimeout – Время жизни (в секундах) соединения. При больших значениях сервер не закрывает процесс слишком долго и он висит бесполезно занимая часть ресурсов.
Мы подошли к настройке MPM (модуль многопоточной обработки). В apache любой запрос обрабатывается в процессе или потоке. За многопоточность как раз и отвечает MPM. При установке сервера можно выбрать один из нескольких модулей. Почему prefork MPM, а не worker MPM? По умолчанию для unix используется именно prefork, но на всякий случай можно выполнить через SSH – подключение команду ‘httpd -V‘. В моем случае ответ – Server MPM: prefork. Работает prefork следующим образом – модуль создает несколько дочерних процессов, при этом в каждом процессе только один поток. В отличае от worker, который обрабатывает несколько потоков на процесс, prefork потребляет больше ресурсов, но более стабилен. В основном этим и обусловлен выбор, хотя многие считают, что worker работает быстрее.
Переходим непосредственно к настройке.
StartServers – устанавливает количество дочерних прицессов, которые создаются при запуске сервера. Параметр динамический и изменяется в процессе работы, поэтому можно его не менять.
MinSpareServers - задает минимальное число неиспользуемых дочерних процессов, которые ожидают в готовности принят запрос. Создание нового процесса достаточно затратная операция и при большом количестве запросов на сервер будет ложится лишняя нагрузка.
MaxSpareServers – задает максимально число неиспользуемых дочерних процессов, которые ожидают в готовности принят запрос. Опять же, если создано много дополнительных процессов, то система будет нагружаться сильно даже при минимальном количестве клиентов.
Стоит еще раз заострить внимание на том, что неправильная настройка параметров MinSpareServers и MaxSpareServers может привести к перерасходу ресурсов, либо к замедлению работы всей системы.
ServerLimit – эта директива устанавливает максимальное значение MaxClients. Рекомендуется устанавливать это значение равным значению в директиве Maxclients.
MaxClients - следует обратить внимание, что это самый важный параметр настройки Prefork MPM. Директива устанавливает максимальное количество параллельных процессов, создаваемых для обработки запросов. Чем больше значение, тем больше одновременно может быть обработано запросов и тем больше будет израсходовано памяти. При использовании динамических страниц с PHP на процесс может быть выделено 16-32МБ. Чтобы определить точнее необходимо через SSH-соединение выполнить команду ‘ps -ylC httpd –sort:rss‘ (между y и С находится строчная буква L!, а перед sort 2 минуса). На выходе мы получим табличку, где в колонке RSS и будут находится искомые значения занятой памяти, для получения значений в мегабайтах их нужно разделить на 1024. Для получения общей информации о памяти можно выполнить команду ‘free -m‘. Теперь можно рассчитать примерное значение самого параметра по любой из формул:
MaxClients ≈ (RAM – размер_загруженных_приложений)/(размер_процесса), либо
MaxClients ≈RAM* 70% / Max_размер_памяти_под_процесс.
Вторая формула чисто эмпирическая, и менее точная, расход памяти приложениями сервера заложен в 30% и, в зависимости от настроек, цифра может меняться в любую сторону. Полученное значение еще не гарантирует правильную работу сервера, следует понаблюдать некоторое время за распределением ресурсов. В случае если параметр установлен ниже оптимального значения, сервер под нагрузкой обслуживает MaxClients запросов, при этом память еще свободна, а следующие запросы уже отправляются в очередь, что приводит к замедлению работы сайта. Если же наоборот значение слишком высоко вся память будет занята, система залезет на диск и это приведет к резкому замедлению работы. Для оценки можно воспользоваться командой ‘top -p 30′ вверху можно будет увидеть значения памяти и загрузку процессора.
MaxRequestsPerChild – задает количество запросов, которые может обработать дочерний процесс до перезапуска. Значение должно быть достаточно большим, чтобы все время не создавать новые процессы. Но рекомендуется все же его ограничить (0 – неограниченно), чтобы при длительной работе Apache, в случае “утечки памяти”, процесс был принудительно завершен.
В моем случае простое включение KeepAlive с таймаутом в 1сек. дало заметный рост скорости отклика сайта. Более точная настройка MaxClients в сторону увеличения сбалансировала потребление памяти, и несколько ускорила отклик при большом наплыве посетителей.
Поделиться в соц.сетях
Похожие записи
Мне нравится! | ||
| Нравится | ||











24 comments
SeoMazzi says:
Май 27, 2009
Вот сейчас как раз курю тему конфигов. Настроил nginx как frontend server? Как-то мало спасает хотя лучше стало.
Вопрос как много сайтов можно держать на оперативке равной в 128 метров, учитывая, что трафика на на них почти нет (max 10 уников), но каждый из них конектитсо к mysql?
SeoMazzi says:
Май 27, 2009
ps -ylC httpd -sort:rss
У меня sort только с двумя минусами работает
ps -ylC httpd –sort:rss
xela says:
Май 28, 2009
А какая разница сколько, главное, чтобы одновременных запросов было немного, иначе сайты тормозить будут.
xela says:
Май 28, 2009
Минусов там 2, просто сливается. На всякий добавил в описание, чтобы не путались.
tim71 says:
Дек 24, 2009
Спасибо. Настроил vds длагодоря статье. Полез искать от того что тормозить стало ужасно и в конце концов в пик (100-120 хостов одновременно) сервер умирал.
Поставил KeepAliveTimeout 1
StartServers 2
MinSpareServers 3
MaxSpareServers 5
ServerLimit 20
MaxClients 20
(1200 мгц, 400 рам)
На вдс 15 сайтов, с 50-200 хостов сутки, и 1 сайт с 4500-5000 хостов.
Сейчас (самый пик) общее по сайтам одновременно примерно 100 человек
проц 71% память примерно 70-75%, посравнению с тем что было – сайты летают )
при 60-70 одновременно посетителях время загрузки страницы (на большом сайте на dle) было 1200мс сейчас в районе 180-250
Стоит чтото еще подстраивать или показатели в норме?
(просто я в этом еще лол, раньше пользовался только вирт хостингом, так что особо на меня не кричите
)
xela says:
Дек 25, 2009
Ну раз сайты летают, значит все хорошо. Когда опять нехватка ресурсов образуется стоит настроить кэширование. А пока лучшее – враг хорошего.
tik says:
Янв 31, 2010
Приветствую всех.
Статья полезная, все доступно.
Мучает один вопрос:
поставил в конфиге
ServerLimit 30
MaxClients 30
НО,
ps aux | grep httpd |wc -l
127
Как такое может быть если они ограничены ?
xela says:
Янв 31, 2010
Сервер перегружали, в этом файле настройки продублировали /etc/httpd/conf.d/swtune.conf, настраивали правильную секцию?
tik says:
Янв 31, 2010
Дело в том, что апач собирался из исходников и конфиг один /usr/local/apache2/conf/httpd.conf
Серв не ребутили, только апач.
Собстенно теперь проребутил серв – вылезла ошибка:
root:~# /usr/local/apache2/bin/apachectl restart
WARNING: MaxClients of 250 exceeds ServerLimit value of 20 servers,
lowering MaxClients to 20. To increase, please see the ServerLimit
directive.
Собственно видно, что апач читает конфиг в правильном месте, но считывает 250 откуда-то…
Всё, нашёл, оказывается настройки для префорка у меня подгружались отдельным конф файлом.
Теперь (основываясь на первых 3-х минутах работы) создаётся не более 135ух хттпд-ов(в конфе 130 маклиентс + 5 макспаресерверс).
Насчёт
ServerLimit и MaxClients:
на сайтах с посещаемостью с 5к+ лучше ставить эти параметры в ранние трёх-значные числа(100-150). Ну если конечно не хотите чтобы пользовтаели загружали Ваш сайт мин 5
Автору спс за статью, с её помощью сбалансировал нагрузку на проц, озу, а главное на диск(теперь ва максимум до 70% прыгает).
xela says:
Янв 31, 2010
Хорошо, что помогла, удачи.
DESCONECT says:
Июнь 11, 2010
Здравствуйте у меня такая проблемам httpd едать 120 метров это раз
Второе я поставил StartServers 5
MinSpareServers 2
MaxSpareServers 10
MaxClients 32
MaxRequestsPerChild 512
У меня в течениии нескольких секунд после рестарт запущенно 33 демона апатча.
Для эксперимента ставил 64 и 128 параметр MaxClients одинаково в течении короткого промежутка времени сразу запускаются все.
По поводу первого я как бы новенький в администрировании но судя по запущеным модулям пхп такой объем не должен быть по прикидкам гдето порядка 30 метров на демона должно быть.
По второму случаю также не совсем ясно почему стратуют сразу все демоны.
Так и должно быть или что то нужно править.
Сервер работает без сбоев пользователи нежалются но меня беспокоит такой расход памяти и как бы куда столько пользователей в сутки около 500-800 больше нету.
Куда вы посоветуете обратить моее внимание ??? или это норма и беспокоиться не следует. Да нумдикс пока не запущен думаю пока нету в нем смысла (или всеже есть ??).
xela says:
Июнь 12, 2010
120 метров оперативки это еще не придел для апача. На мой взгляд все нормально, KeepAlive у вас включен?
DESCONECT says:
Июнь 13, 2010
120 метров это один демон httpd . А их сразу запускается штук 34 таких ореликов
Как найти функцию KeepAlive у апатча 2 ?? в конфиге не могу найти
xela says:
Июнь 24, 2010
DESCONECT, 120 на каждый – это слишком круто, что-то в настройках неверно. KeepAlive в httpd.conf должен быть, немного раньше, чем основные настройки.
Олег says:
Сен 3, 2010
Привет всем.
Подскажите, пожалуйста, как можно сократить time-to-first-byte.
В целом, статья помогла сократить 50сек.!!! до 3-18 сек.
Настройки поставил следующие:
StartServers 5
MinSpareServers 10
MaxSpareServers 10
MaxClients 30
ServerLimit 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Олег says:
Сен 3, 2010
Хотелось бы сократить это время до, хотя бы, одной секунды. )
xela says:
Сен 5, 2010
вообще очень странно, что так долго отдается контент. А сколько оперативки, какая примерно нагрузка на сервер?
Alex says:
Сен 6, 2010
Может подскажете, в чем может быть проблема.
Есть VPS, CentOS 5.3 + Plesk, 768 Мб RAM. Настройки в swtune.conf по-умолчанию:
StartServers 1
MinSpareServers 1
MaxSpareServers 5
ServerLimit 10
MaxClients 10
MaxRequestsPerChild 4000
Бывает, что я раздаю через него файлики нескольким пользователям с “жадными” качалками, поэтому MaxClients повышаю и тут сталкиваюсь с малаленькой проблемой непонятного мне характера: начинает тормозить ProFTPD. То есть при подключении по ftp FileZilla, например, пишет: “Соединение установлено, ожидание приглашения…”, повисает и вылетает по таймауту пару раз, после чего подключается нормально (некоторое время). Через несколько минут попробовать – снова та же история.
Проблема появляется непосредственно после редактирования swtune.conf и перезапуска (причем даже когда сервер вовсе простаивает), НО!!! Она уже не решается возвращением настоек по-умолчанию =)
xela says:
Сен 6, 2010
А почему вы сразу не хотите настроить, памяти ведь немало? В httpd.conf дублируете настройки? Вообще больше похоже на то, что хостинг рубит скорость, эти параметры на ftp не должны влиять.
Alex says:
Сен 6, 2010
Так сразу после переустановки системы (ее делает тп по заявке) эти параметры и стоят. Хотя в httpd.conf стоит 8,5,15,256,256 и 4000 соответственно. Но все работает как часики, жалко только по свтюновскому сценарию ^_^
Сейчас продублировал в httpd.conf мои настройки из swtune.conf, но принципиально ничего не изменилось.
StartServers 10
MinSpareServers 10
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 10000
# ps aux | grep httpd |wc -l
14
Ставил и меньше – без разницы))
Хостинг – кейвеб, скорость они не рубят точно, в этот момент даже не обязательно кто-то должен что-то качать, даже при простое proftpd сначала усиленно “думает”, только после третьего-четвертого таймаута пускает клиента некоторое время на любые домены без проблем. Причем ни качальщики, ни посетители никаких неудобств не испытывают, получают по полной программе и довольно шустро.
xela says:
Сен 7, 2010
Все-таки думается мне, что рыть нужно настройки самого proftpd. Вот хороший сайт: http://linux.yaroslavl.ru/docs/serv/ProFTPD.html
Alex says:
Сен 7, 2010
Увы, в первую очередь проверил! Конфиг едва ли не идеальный, всё лишнее и неактуальное отключено, перелопатил даже самые сомнительные директивы…
В стэндэлон, кстати, такая же фигня. Все бы ладно, но я никак понять не могу, почему до редактирования никаким боком к нему не стоящих параметров он работает просто идеально)) Единственное, что мне приходилось после переустановки системы делать – докачку включать…
Спасибо за линк, буду перепроверять еще раз. Где-то же эта бага сидит))
Дмитрий says:
Апр 3, 2011
“KeepAlive – Для динамических страниц на мой взгляд просто необходимо его включить.”
При высокой нагрузке если KeepAlive on будут сплошные 504 ошибки. Апач захлебнётся от такой нагрузки, сожрёт все ресурсы процессора и сервак сдохнет так что лучше ставить KeepAlive Off.
xela says:
Апр 3, 2011
Если у вас суперлегкий сайт, очень быстрый канал, и много ресурсов процессора и оперативки, то может быть. В противном случае на каждый запрос от каждого клиента будет создаваться свой процесс и как раз память кончится в момент, а при включенном KeepAlive процессы не создаются так быстро и свободной памяти будет больше. По крайней мере на моем серваке все именно так и получилось.