Как я могу предотвратить появление процессов apache, когда я запускаю apache и продолжаю убивать мою машину? - PullRequest
55 голосов
/ 01 февраля 2009

У меня на одном компьютере с Debian есть приложение с интенсивным движением, и apache начал странно себя вести.

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

Вот что я получаю сразу после запуска apache:

top -   20:14:44    up         1:16,      2 users,    load average: 0.48, 0.10, 0.03
Tasks:  330 total,  5 running, 325 sleeping,   0 stopped,   0 zombie
Cpu(s): 12.0%us,    21.4%sy,   0.0%ni,        65.7%id,   0.2%wa,  0.1%hi,  0.7%si,  0.0%st
Mem:    8179920k    total,     404984k used,  7774936k free,    60716k buffers
Swap:   2097136k    total,     0k used,       2097136k free,    43424k cached


10251 www-data  15   0  467m 8100 4016 S    6  0.1   0:00.04 apache2
10262 www-data  15   0  467m 8092 4012 S    6  0.1   0:00.05 apache2
10360 www-data  15   0  468m 8296 4016 S    6  0.1   0:00.05 apache2
10428 www-data  15   0  468m 8272 3992 S    6  0.1   0:00.05 apache2
10241 www-data  15   0  467m 8256 4012 S    4  0.1   0:00.03 apache2
10259 www-data  15   0  467m 8092 4012 S    4  0.1   0:00.04 apache2
10274 www-data  15   0  467m 8056 4012 S    4  0.1   0:00.03 apache2
10291 www-data  15   0  468m 8292 4012 S    4  0.1   0:00.03 apache2
10293 www-data  15   0  468m 8292 4012 S    4  0.1   0:00.03 apache2
10308 www-data  15   0  468m 8296 4016 S    4  0.1   0:00.02 apache2
10317 www-data  15   0  468m 8292 4012 S    4  0.1   0:00.02 apache2
10320 www-data  15   0  468m 8292 4012 S    4  0.1   0:00.04 apache2
10325 www-data  15   0  468m 8292 4012 S    4  0.1   0:00.04 apache2

И так далее ... с большим количеством процессов apache2.

Менее чем через минуту вы можете видеть, что нагрузка снизилась с 0,48 до 2,17. Если я не остановлю apache на этом этапе, нагрузка будет увеличиваться в течение нескольких минут или меньше, пока машина не умрет.

top -    20:15:34 up 1:17,       2 users,  load average: 2.17, 0.62, 0.21
Tasks:   1850 total,  5 running, 1845 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.3%us,      2.1%sy,    0.0%ni, 96.4%id,  0.0%wa,  0.1%hi,  1.0%si,  0.0%st
Mem:     8179920k     total,     1938524k used,  6241396k free,    60860k buffers
Swap:    2097136k     total,     0k used,  2097136k free,    44196k cached

У нас есть брандмауэр, в котором мы заносим в белый список адреса, которые, как мы знаем, могут попасть на наш сайт.

Любые идеи о том, в чем может быть проблема, приветствуются.

Спасибо!

Ответы [ 6 ]

42 голосов
/ 01 февраля 2009

Вы, вероятно, допустили ошибку при настройке Apache для использования гораздо больше, чем все ваши оперативной памяти. Это простая ошибка.

Я предполагаю, что вы используете Prefork Apache и сервер приложений (например, PHP или mod_perl). В этой модели у вас будет максимум (MaxClients * max использование памяти вашего приложения на процесс) используемой памяти. Если у вас не так много, пришло время уменьшить одно, другое или оба.

В общем случае это означает уменьшение MaxClients до уровня, когда на вашем сервере достаточно оперативной памяти, чтобы справиться.

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

Однако уменьшение MaxClients в конечном итоге приведет к тому, что приложение станет недоступным, особенно если у вас есть сообщения активности активности и время ожидания активности слишком велико. Процессы, которые просто поддерживают соединение активным (состояние K в состоянии сервера), все еще используют много оперативной памяти, и это может быть проблемой - попытайтесь минимизировать время ожидания keepalive или полностью его отключить.

Вы должны следить за состоянием сервера (как предусмотрено mod_status).

Конечно, вы должны вносить ЛЮБЫЕ из этих изменений, если понимаете последствия. Подумайте дважды, измените конфиг один раз. Если у вас есть ЛЮБАЯ возможность протестировать изменения с моделируемой нагрузкой на аналогичной непроизводственной машине спецификации, сделайте это.

16 голосов
/ 29 июля 2014

используйте ps -aux | grep apache, чтобы узнать количество процессов, на которых работает apache. Ищите столбец «RSS», который дает оценку памяти, используемой каждым процессом. В качестве альтернативы вы можете использовать «top», где вы смещаете + f и затем выбираете столбец% MEM для сортировки процессов по использованию памяти.

Количество процессов определяется директивой MaxClients в вашем файле apache.conf. То, как вы пришли к этой фигуре, описано в this page ;

  1. SSH на ваш сервер от имени root.
  2. Run top.
  3. Нажмите shift + m.
  4. Обратите внимание на наибольшую RES-память, используемую httpd.
  5. Нажмите Q, чтобы выйти из верхней части.
  6. Выполнить: остановка службы httpd (в debian, sudo service apache2 stop)
  7. Когда httpd остановлен, выполните: free -m
  8. Обратите внимание на память, указанную в разделе «используется».
  9. Найдите гарантированную память для вашего плана VPS. Служба поддержки расскажет вам, сколько вы гарантировали, если не можете его найти.
  10. Вычтите ИСПОЛЬЗОВАННУЮ память из памяти, на которую ваш план ГАРАНТИРУЕТСЯ. Это даст вам БЕСПЛАТНУЮ БАССЕЙН ПАМЯТИ.
  11. Умножьте значение вашего БЕСПЛАТНОГО БАССЕЙНА ПАМЯТИ на 0,8, чтобы найти свой средний ДОСТУПНЫЙ БАССЕЙН APACHE (это даст вам 20% запас памяти на периоды серийной съемки).
  12. Разделите ваш ДОСТУПНЫЙ БАССЕЙН APACHE на наибольшее значение RES-памяти, используемое httpd. Это даст вам значение MaxClients, которое должно быть установлено для вашей системы. (Округлите его до ближайшего целого числа, меньшего, чем это значение, если оно имеет компонент дроби.)

Правильное значение для «MaxClients» обеспечит правильное распределение памяти для вашего сервера Apache. Вот как я это решил.

В Debian файл apache conf находится по адресу /etc/apache2/apache2.conf

10 голосов
/ 01 февраля 2009

Вы недавно изменили свой файл конфигурации? Если да, то я надеюсь, что вы сохраните старую версию для сравнения?

Если нет, найдите директивы «StartServers», «MaxSpareServers» и «MinSpareServers». Обычно вы хотите оставить эти значения по умолчанию, но возможно, что они были преднамеренно установлены на высокий уровень (плохая идея) или случайно установлены таким образом из-за неправильного редактирования конфигурации.

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

Первый шаг - журнал доступа. Второй шаг - запустить netstat, чтобы увидеть, откуда могут происходить соединения. И если он работает в той же системе, вы можете заглянуть в / proc / * / fd, чтобы найти два конца соединения.

5 голосов
/ 24 декабря 2015

Этот вопрос древний, но я чувствую себя обязанным добавить сюда ответ, потому что все существующие ответы упускают из виду ключевую информацию из OP: после того, как нагрузка начала расти в течение нескольких минут, top сообщает что все еще достаточно ресурсов ЦП и памяти. Обычно остается один преступник, и это ввод / вывод.

Проверьте, есть ли полный раздел с df -h. Если нет, посмотрите, не перезаписывает ли ваше приложение диск с помощью vmstat 1 10 или iostat 1 10 (они предоставляются пакетом 'sysstat' в Debian / Ubuntu). Если проблема по-прежнему отсутствует, возможно, у вас есть ошибки ввода-вывода на уровне устройства или проблемы с сетью для сетевого хранилища. Проверьте системные файлы и файлы журнала демона.

3 голосов
/ 26 февраля 2009

Как уже было сказано (при условии Prefork Apache) - MaxClients = max процессов одновременно.

Если вы обнаружите, что вас забивают реальным трафиком (а не неправильно настроенными StartServers / Min / MaxSpareServers), вы можете сделать еще несколько вещей:

  1. Настройка отдельного, легкого Apache процесс (или Lighttpd) для ваш статический контент. Таким образом, все маленький, статичный материал не «загрязняет» ваше приложение с большим весом процесс. Это может быть на том же сервер или другой. не вопрос.
  2. Поместите обратный прокси как Squid в фронт вашего процесса Apache. обратный прокси быстро отсосет контент от Apache и хранить его в памяти, а затем отправить его обратно к клиенту. Сюда AOL пользователи на 14.4kb модемах не бьются из ваших ценных слотов Apache. Как бонус, такая установка может быть настроен для кэширования некоторых ваших содержание, чтобы уменьшить нагрузку на ваш Apache обрабатывает.
2 голосов
/ 11 июня 2009

Ваш вывод 'top' показывает, что у вас достаточно свободной памяти, поэтому я не думаю, что MaxClients является проблемой (разве есть какая-то проблема с выделением Apache более 2 ГБ памяти?) В вашем журнале ошибок должны отображаться ошибки если возникают проблемы с созданием большего количества детей.

Скорее всего, ваши процессы Apache действительно используют много ресурсов. Если вы используете приложения PHP, попробуйте установить eAccelerator, который хорошо оптимизирует и кэширует код PHP. Другие вещи могут включать в себя тяжелые запросы MySQL, медленный распознаватель DNS и т. Д. Помимо этого, он больше понимает, какие программы поражаются и что они делают.

...