Назад |
Перейти на главную страницу
Скачки памяти Apache, возможные причины?
В прошлую пятницу (07.10.2011) мы начали увеличивать процессы httpd.worker с типичных 10-15 МБ зарезервированной памяти до 10 ГБ + (гигабайт) за 1-2 минуты. Это, очевидно, останавливает сервер, поскольку он начинает подкачку и т. Д. Мы должны перезагрузить сервер, чтобы он снова заработал. Если мы поймем его вовремя, мы сможем убить нарушившего httpd.worker, и пока все будет хорошо.
Система
- RHEL 5.5
- Apache httpd-2.2.3-45.el5_6.2.x86_64.rpm (исправлено для предотвращения недавней уязвимости фильтра диапазона байтов)
- Использование Apache MPM worker (не prefork)
- mod_jk 1.2.28
- mod_rewrite
- OpenSSL (последняя версия Red Hat)
- Tomcat / JBoss Web 2.1 (JBoss 5.1.0)
- выделенные серверы (неразделенные) по 12 гигабайт оперативной памяти на каждом
Симптомы
- При нормальной нагрузке один процесс httpd.worker внезапно вырастает с 10 МБ до нескольких гигабайт в зарезервированной памяти. Придется убить -9 процесс, иначе сервер остановится
- Иногда происходит с несколькими процессами httpd.worker примерно в одно и то же время
- После того, как нарушающий процесс (-ы) был убит, все снова в норме (в считанные минуты).
- Происходило ок. каждые 8–12 часов, начиная с прошлой пятницы, четкой картины нет.
- Никаких всплесков трафика запросов, ведущих к этому
- Нет лишнего трафика / ошибок в access_log и error_log
Дополнительные замечания
- Наша нормальная нагрузка составляет ~ 5-10 запросов / сек на каждый сервер, не сумасшедшая.
- Мы устанавливаем (после того, как это началось) MaxRequestsPerChild равным 250, и рабочие циклы правильно зацикливаются. Подразумевает, что проблема связана с одним или небольшим набором запросов.
- Мы не вносили изменений в конфигурацию приложений / системы за последние 2 недели.
- Поскольку это не постоянная проблема (проходит в считанные минуты), это не похоже на
- Это похоже на уязвимость фильтра диапазона байтов, но мы исправили и протестировали ее (https://issues.apache.org/bugzilla/show_bug.cgi?id=51714)
- Я прочитал несколько сообщений о сбоях сервера (и в других местах), но не нашел ни одного, описывающего один рабочий процесс, выходящий из-под контроля с памятью.
Вопросы
- Что может привести к тому, что память отдельных процессов httpd.worker выйдет из-под контроля таким образом? Или даже что-то сверх типичного (10-15м для нашей конфигурации)?
- Есть предложения по устранению неполадок? Мы смотрим top, server-status, jkstatus, мониторинг с помощью cacti, установили monit и запускаем логирование mod_jk.
Конфигурация Apache / mod_jk / Tomcat (JbossWeb)
Из httpd.conf ...
<IfModule worker.c>
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 150
ThreadsPerChild 50
MaxRequestsPerChild 250
</IfModule>
Из worker.properties mod_jk ...
# Define Node1 worker.node1.port=8009
worker.node1.host=127.0.0.1 worker.node1.type=ajp13
worker.node1.lbfactor=1 worker.node1.connection_pool_timeout=60
worker.node1.connection_pool_size=35 worker.node1.connect_timeout=5000
worker.node1.prepost_timeout=5000
Из tomcat server.xml ...
<Connector protocol="AJP/1.3" port="8009"
address="${jboss.bind.address}" redirectPort="8443" maxThreads="350"
connectionTimeout="60000" enableLookups="false"/>
Буду признателен за любой вклад!
Мы официально обнаружили и исправили проблему, это был просто цикл в наших правилах mod_rewrite. Он существовал в течение нескольких месяцев, но никто не попал по конкретному URL-адресу, который вызвал проблему. Это, по крайней мере, один из примеров, которые могут привести к выходу отдельного процесса httpd.worker из-под контроля с потреблением памяти.