Подтвердить что ты не робот

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

У меня есть приложение с высокой нагрузкой на одном устройстве 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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

  • SSH на ваш сервер как root.
  • Выполнить верхнюю часть.
  • Нажмите shift + m.
  • Обратите внимание на самую высокую память RES, используемую httpd.
  • Нажмите Q для выхода сверху.
  • Выполнить: сервис httpd stop (В debian, sudo service apache2 stop)
  • Когда httpd остановлен, выполните: free -m
  • Обратите внимание на память, указанную в разделе "Используется".
  • Найдите гарантированную память для своего плана VPS. Поддержка может рассказать вам, сколько вы гарантировали, если не можете найти его.
  • Вычитайте из памяти, что у вас ГАРАНТИРОВАННАЯ память. Это даст вам базу БЕСПЛАТНЫЙ ПАМЯТЬ ПАМЯТИ.
  • Умножьте значение вашего БЕСПЛАТНОГО ПАМЯТИ ПАМЯТИ на 0,8, чтобы найти свой средний доступный APACHE POOL (это позволит вам зарезервировать 20% резервных копий для периодов пачек).
  • Разделите свой доступный APACHE POOL на самую высокую память RES, используемую httpd. Это даст вам значение MaxClients, которое должно быть установлено для вашей системы. (Округлите его до ближайшего целого числа, меньшее этого значения, если оно имеет компонент фракции.)

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

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

Ответ 3

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

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

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

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

Ответ 4

Как уже говорилось (при условии, что Prefork Apache) - MaxClients = max процессов одновременно.

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

  • Настройте отдельный, легкий apache (или lighttpd) для ваш статический контент. Таким образом, все маленький, статический материал не "загрязняйте" свое тяжелое приложение обработать. Это может быть на одном и том же сервер или другой. не дело.
  • Поместите обратный прокси-сервер, например Squid   перед вашим процессом Apache.   обратный прокси быстро сосать   содержимое из Apache и сохранить его   в памяти, а затем отправить его обратно   для клиента. Таким образом, AOL   пользователи с модемами 14.4kb не запускают один   ваших ценных слотов Apache. Как   бонус, такая настройка может быть   настроен для кэширования некоторых ваших   контента, чтобы уменьшить нагрузку на ваш   Apache.

Ответ 5

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

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

Ответ 6

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

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