2009-02-01 11 views
51

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

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

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

Спасибо!

+0

Не связанное с программированием ... Пожалуйста, исправьте форматирование верхнего выхода. Посмотрите на работника Apache MPM, если вам нужно много одновременных подключений; настройка настроек keepalive также может помочь. –

+0

Спасибо, нам не нужны все эти параллельные соединения. На самом деле все отлично работало без стольких подключений до этого и только начинало действовать странно, хотя движение уменьшилось. –

+0

Почему люди голосуют за закрытие? Я запускаю Apache на своей машине, когда занимаюсь веб-разработкой в ​​PHP или Python, и это может быть проблемой, с которой я сталкиваюсь однажды. Я бы сказал, что это очень много программирования. –

ответ

10

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

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

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

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

+0

Я могу повторить эту старую версию. У нас даже есть/etc/в нашем SCM. – mark

+0

Я устанавливаю git-репозиторий в базе моего/etc/apache2. Muhaha. – CommaToast

41

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

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

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

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

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

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

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

+19

«Подумайте дважды, измените конфигурацию один раз». +1 – aaronsnoswell

3

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

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

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

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

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

14

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

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

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

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

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

2

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

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