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

Почему мои процессы httpd mpm_prefork собираются так быстро?

[РЕДАКТИРОВАТЬ]

В основном плохой вопрос - см. Мой ответ

[/РЕДАКТИРОВАТЬ]

У нас есть система под управлением RHEL6, x64. Мы используем локальную установку apache 2.2.22 из исходников. мы обслуживаем в первую очередь:

  1. приложения mod_perl (при локальной установке perl 5.16.0)
  2. приложения tomcat, проксированные с помощью mod_jk

Вот некоторый контекст; главный вопрос ниже.

Все это говорит с серверной частью Oracle.

У нас возникают проблемы с тем, что Oracle перестает отвечать на запросы. Мы думаем, что это связано с тем, что мы достигли максимального предела процесса в Oracle. Мы увеличили лимит процесса, но теперь мы испытываем нехватку памяти на сервере Oracle. У нас куча сеансов оракула простаивает. Я могу отследить кучу из них до процессов httpd.

Apache :: DBI из mod_perl запускает новое соединение с базой данных с каждым порожденным дочерним элементом httpd. Мы обеспокоены тем, что они не всегда закрываются должным образом при выходе httpd ... и выходе httpd очень часто. Я знаю, что было бы хорошо изменить приложения mod_perl, чтобы использовать лучшую форму пула соединений с базами данных; мы планируем заняться этим, но хотели бы решить нашу непосредственную проблему раньше.

Итак, вот главный вопрос.

Мы используем префорк MPM.

Дочерние процессы apache длятся не более нескольких минут.. Анализ журнала показывает, что каждый из них обслуживает менее 50 клиентов перед выходом; последний запрос, который обслуживает каждый ребенок, это OPTIONS * HTTP/1.0 по какой-то внутренней связи; У меня такое впечатление, что это "пинг" от главного процесса.

Я настроил конфигурацию MPM следующим образом. Я не хотел поднимать MinSpareServers слишком высоко, потому что, в конце концов, я пытаюсь минимизировать количество сеансов для Oracle.

MinSpareServers       5
MaxSpareServers       30
MaxClients            150
MaxRequestsPerChild   10000

Сейчас мы обслуживаем 250-300 запросов в минуту.

У нас запущен 21 httpd, старшему из которых (кроме главного, принадлежащего root) 3 минуты.

Такая скорость сбора детей апачей действительно кажется чрезмерной. Что могло быть причиной этого?

Apache был построен с помощью:

  $ ./configure --prefix=/opt/apache --with-ssl=/usr/lib --enable-expires --enable-ext-filter --enable-info --enable-mime-magic --enable-rewrite --enable-so --enable-speling --enable-ssl --enable-usertrack --enable-proxy --enable-headers --enable-log-forensic

Информация о конфигурации Apache:

% /opt/apache/bin/httpd -V
Server version: Apache/2.2.22 (Unix)
Server built:   Jul 23 2012 22:30:13
Server's Module Magic Number: 20051115:30
Server loaded:  APR 1.4.5, APR-Util 1.4.1
Compiled using: APR 1.4.5, APR-Util 1.4.1
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/opt/apache"
 -D SUEXEC_BIN="/opt/apache/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

модули компилируются в apache, а не в общие библиотеки:

% /opt/apache/bin/httpd -l
Compiled in modules:
  core.c
  mod_authn_file.c
  mod_authn_default.c
  mod_authz_host.c
  mod_authz_groupfile.c
  mod_authz_user.c
  mod_authz_default.c
  mod_auth_basic.c
  mod_ext_filter.c
  mod_include.c
  mod_filter.c
  mod_log_config.c
  mod_log_forensic.c
  mod_env.c
  mod_mime_magic.c
  mod_expires.c
  mod_headers.c
  mod_usertrack.c
  mod_setenvif.c
  mod_version.c
  mod_proxy.c
  mod_proxy_connect.c
  mod_proxy_ftp.c
  mod_proxy_http.c
  mod_proxy_scgi.c
  mod_proxy_ajp.c
  mod_proxy_balancer.c
  mod_ssl.c
  prefork.c
  http_core.c
  mod_mime.c
  mod_status.c
  mod_autoindex.c
  mod_asis.c
  mod_info.c
  mod_cgi.c
  mod_negotiation.c
  mod_dir.c
  mod_actions.c
  mod_speling.c
  mod_userdir.c
  mod_alias.c
  mod_rewrite.c
  mod_so.c

И последнее замечание: все пакеты red hat httpd, apr и perl установлены, но ldd показывает, что ни одна из этих библиотек не связана с запущенным httpd.

ааарх

ответ в этом случае оказывается, что я не имел настроил apache с этими параметрами maxrequestsperchild, minspareservers и maxspareservers.

Я изменил конфигурационный файл, который, как мне казалось, был Included в основном файле, но не было. Новичок на этом сайте и старый старый конфиг. вздох.

Итак, поведение, которое я описываю, является компилированным по умолчанию (я проверил трижды; больше нигде не устанавливается). В документации предполагается, что это стандартные значения по умолчанию:

http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxrequestsperchild

http://httpd.apache.org/docs/2.2/mod/prefork.html

MaxRequestsPerChild 10000
MaxSpareServers 10
MinSpareServers 5

Я думаю, что поведение, которое я видел, не соответствовало этим настройкам по умолчанию. Я запишу ошибку с apache.

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