MaxClients в apache. Как узнать размер моего процесса?

9

От http://httpd.apache.org/docs/2.2/misc/perf-tuning.html

Самая большая проблема с оборудованием, влияющая на производительность веб-сервера, - это оперативная память. Веб-сервер никогда не должен менять местами, так как замена увеличивает задержку каждого запроса за пределы точки, которую пользователи считают «достаточно быстрой». Это заставляет пользователей останавливаться и перезагружаться, что еще больше увеличивает нагрузку. Вы можете и должны контролировать настройку MaxClients, чтобы ваш сервер не порождал столько дочерних элементов, он начал обмениваться. Эта процедура для этого проста: определите размер вашего среднего процесса Apache, просматривая список процессов с помощью такого инструмента, как top, и разделите его на общую доступную память, оставляя место для других процессов.

Основная проблема заключается в том, что я не могу понять, как узнать размер, потому что, ну у меня размер httpd не больше 3888

Но если нам нужно определить число для MaxClients, и у меня есть 4 ГБ ОЗУ, то я получу: 972, поэтому я должен использовать как 900 в MaxClients?

Larry
источник
4
«У меня размер httpd не больше 3888» - думаю, я говорю за всех, когда говорю: «А?»
womble

Ответы:

9

Сначала определите PID одного из ваших процессов Apache.

Тогда вы можете сделать что-то вроде этого:

cat /proc/PIDHERE/status | grep VmRSS

Это даст (текущий) резидентный набор-размер этого конкретного процесса, аналогично:

VmRSS: 304456 kB

Это значение, как это звучит, это размер резидентного процесса в оперативной памяти.

Затем нормализуйте свою единицу измерения ( 4GB * 1024 * 1024 = 4,194,304 KB). Делить:

4194304 KB / 304456 KB = 13.77 processes

Учтите, что в вашей системе, возможно, запущены другие процессы, которые также будут потреблять память, и в идеале вы хотите свести к минимуму перестановку, поэтому вряд ли вы захотите настроить 13 Apache MaxClients (используя мои номера), вам нужно немного меньше (на ваше усмотрение) ).

Это грубая оценка; размер ваших процессов Apache может со временем увеличиваться в зависимости от нагрузки.

loopforever
источник
1
Хотя RSS не включает в себя общие страницы, он включает в себя страницы, помеченные как копируемые при записи - то есть на машине есть место для большего количества процессов, чем (сумма rss) / (физическая память). Смотрите также мой ответ в другом месте - свободное место необходимо для хорошей работы.
symcbean
4

Прогнозирование maxClients из тестовых сценариев является отправной точкой, но для правильного решения проблемы необходимо начать измерять поведение своего приложения с реальным трафиком.

Предполагая, что ваш apache работает на pre-fork ....

Настройте задание cron для подсчета количества процессов httpd и вывода «free». Обратите внимание, что если ваш веб-сервер обслуживает какой-либо контент из локальных файлов (и во многих случаях, даже если это не так), объем памяти, доступной для кэша / буферов, будет сильно влиять на производительность. то есть, если вы дойдете до точки обмена, ваша веб-производительность, вероятно, ужасна!

Когда у вас есть какие-либо данные, нанесите их на график и выполните регрессию наименьших квадратов - экстраполируйте, чтобы найти число клиентов, при которых вы достигнете целевого предела использования памяти httpd. Отправной точкой для целевого объекта памяти будет меньше 80% физической памяти / 80% размера содержимого.

(обратите внимание, если для MinSpareServers установлено очень высокое значение, результаты могут быть неточными)

#!/bin/bash

LOGFILE='/var/log/httpd/memusage'
PIDS = `ps -ef | grep httpd | grep -v grep | wc -l`
MEM = `free | grep 'buffers/cache'`
DAY = `date '%Y-%m-%d %H:%M:%S'`
echo ${DAY} ${PIDS} ${MEM} >>LOGFILE

В идеальном мире вы также измеряли бы время отклика URL в том же файле журнала - но это становится намного сложнее.

symcbean
источник
Для меня буферы / кэш-память меняются очень мало, независимо от того, запущено ли 11 клиентов или когда сервер достиг 86 или 151 клиента (и сервер вышел из строя). Что вы ожидаете увидеть в своей переменной MEM? Я получаю два числа, поэтому интересно, если Ubuntu 12.04 дает что-то другое, чем вы ожидали.
PeterB
Попробуйте запустить «бесплатно», и вы увидите, что я ожидаю (2 номера). Если это правда, что между этими числами мало различий в количестве процессов, то либо вы используете сервер на основе событий, либо ваш параметр maxspareservers глупый. Если бы вы опубликовали образец выходных данных и соответствующие части вашего httpd.conf, то, возможно, у нас была бы лучшая картина?
Symcbean
.... а "сбой"? Какой сбой?
Symcbean
Извините, смотрите pastebin.com/aHZCagVn для настроек httpd.conf и примера вывода. Под «крахом» я подразумеваю слишком много клиентов, сервер исчерпывает память и блокируется. Пожалуйста, смотрите pastebin.com/fnXzBfQL для получения дополнительной информации.
PeterB
1
@PeterB кажется более вероятным, что MySQLd вызывает эту проблему. Когда ядро ​​OOM запускает ядро, сначала убивает худших нарушителей, основываясь на значении / proc / PID / oom_score_adj. Как видно из вашего вывода, mysqld пошел первым. Возможно, вам придется настроить параметры в my.cnf более подходящим образом в соответствии с ограничениями вашей виртуальной машины. В качестве / временного / временного решения, просто для того, чтобы увидеть, сможете ли вы избежать использования OOM killer, попробуйте добавить файл подкачки для дополнительной виртуальной памяти; затем избавьтесь от этого, как только вы определили свою реальную проблему.
loopforever