Назад | Перейти на главную страницу

MPM Prefork, слишком много процессов apache2?

У меня такие настройки:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit      1250
    MaxClients            1250
    MaxRequestsPerChild   1500
</IfModule>

Возможно ли, что с 5-10 настройками для мин / макс серверов, когда я делаю верх, есть тонны процессов apache 2 ??

Разве их не должно быть от 5 до 10? Просто посмотрите на 260 спящий процесс O_O (черт возьми, apache)

Нажмите http://img200.imageshack.us/img200/3285/senzatitolo1iw.jpg

Edit1:

Через 30 минут здесь верхний экран:

Нажмите: http://img816.imageshack.us/img816/1645/immagineov.png

После 24 часов UP (лучший заказчик для использования MEM)

Спасибо за любое объяснение

(debian 6, лампа, оперативная память 4 ГБ)

Я дал вам ответ на это в комментариях на Сервер не отвечает на SSH и HTTP, но ping работает, но, видимо, вы мне не верите. Действительно, это правда!

Вам нужен размер MaxClients / ServerLimit в вашу систему. Упомянутые вами «5-10 настроек для мин. / Макс. Серверов» в основном не имеют значения - это просто количество дополнительный серверы слоняются без дела, ничего из того, что сохранит Apache.

Чтобы правильно настроить MaxClients, посмотрите на типичную отметку максимума для вашего httpd (или apache2), а затем разделите на это доступную память. Лучше всего немного опуститься, чтобы дать остальной части системы дышать. Поскольку у вас 4 ГБ ОЗУ и 185 МБ процессов, это означает, что вы ServerLimit значение должно быть не более 21 - вероятно, 20 или 19.

Теперь может быть, что 190 МБ нетипично. Вы можете установить ServerLimit выше, основываясь на другой оценке типичного использования, но тогда вы в основном рискуете, что у вас никогда не будет всплеска. Если это произойдет, ваша система будет недостаточно памяти.

Если вы сможете найти способ ограничить использование памяти для каждого рабочего, это будет победой. Бьюсь об заклад, это случай PHP съел мою оперативную память. Можете ли вы запрограммировать свое приложение, чтобы оно работало в пределах memory_limit? Если вы не можете этого сделать, вам нужна другая модель для запуска вашего PHP. Если вы не можете этого сделать, вам нужно купить больше оперативной памяти.

Prefork MPM Apache управляет серверами самостоятельно. Это всегда будет начинаться с StartServers демонов, и никогда не будет работать меньше, чем MinSpareServers как только это начнется. Он также в конечном итоге выведет из строя / отключит серверы, превышающие MaxSpareServers если они простаивают достаточно долго (я не помню, что такое «Достаточно долго» в этом контексте, и если / как это можно изменить).

ServerLimit устанавливает максимальное количество демонов apache, которые могут работать в любой момент времени - вот почему в вашей ситуации у вас могут быть сотни спящих процессов apache (они были созданы для обслуживания потока запросов и не простаивали достаточно долго, чтобы быть убитым материнским процессом).


Лично я считаю, что 1250 - довольно высокая цена для ServerLimit/MaxClients - 250 может быть более разумным числом (хотя это может привести к случайной ошибке 503 / Server Busy, если вы получаете массивный поток запросов: если это становится хронической проблемой, вы можете увеличить количество или добавить больше серверов для обработки нагрузки ).

Относительно этого вопроса к ваш предыдущий Re: сбой из-за нехватки памяти, обязательно следуйте указаниям Руководство по Apache по этому параметру:

Most important is that MaxClients be big enough to handle as many simultaneous
requests as you expect to receive, but small enough to assure that there is enough
physical RAM for all processes.

… И моя личная аксиома: It's better to give a client a 503 page than knock the server down. :)

Отключите Keepalives и установите MaxClients на 150. Наиболее вероятная причина, по которой у вас просто сидят 260 процессов, является то, что Apache послушно держит соединения браузера открытыми, потому что KeepAlive включен в вашем файле конфигурации apache.

Подсчитайте, сколько серверов у вас может быть запущено в рамках ограничений оперативной памяти вашей системы, выполнив эту команду:

$ ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}'

Если будет производить такой вывод:

Apache Memory Usage (MB): 1608.76
Average Process Size (MB): 55.4745

Теперь остановите apache и узнайте, сколько оперативной памяти у вас доступно без него, используя free:

               total       used       free     shared    buffers     cached
  Mem:       7629384    7415780     213604          0     333428    5341884
  -/+ buffers/cache:    1740468    5888916
  Swap:      7629380       7968    7621412

(выше в килобайтах. free -m покажет вам мегабайты.)

Linux заполнит доступную память буферами и кешем, поэтому добавление свободных + буферов + кеша (213604 + 333428 + 5341884) дает 5888916 Кбайт.

Доступно 588916 КБ / 55474 КБ на процесс apache = 106 серверов. Но установите его ниже, чтобы оставить передышку.

По моему опыту стоит попытаться настроить KeepAliveTimeout после правильной настройки других параметров, касающихся количества процессов. Я говорю «настройка», что означает, что вам следует немного изменить параметр и измерить скорость реакции сервера. Среди наших сайтов один лучше всего работает с KeepAliveTimeout=3 еще один с KeepAliveTimeout=1. Никто из них не доволен KeepAlive выключено. Эта дополнительная настройка избавляет вас от покупки / выделения дополнительной оперативной памяти слишком рано.

Настройка проста, потому что изменение вступает в силу сразу после плавного перезапуска:

sudo apache2ctl -k graceful

(Я восстанавливаю старую ветку, потому что Google все еще считает ее актуальной ...;))