Por que meus processos httpd mpm_prefork estão sendo coletados tão rapidamente?

3

[EDITAR]

Má pergunta, principalmente - veja minha resposta

[/ EDIT]

Temos um sistema rodando RHEL6, x64. Estamos usando uma instalação local do apache 2.2.22 da fonte. nós servimos principalmente:

  1. aplicativos mod_perl (com uma instalação local do perl 5.16.0)
  2. aplicativos do tomcat proxied com mod_jk

Aqui está algum contexto; a questão principal está abaixo.

Tudo isso fala com um back-end da Oracle.

Estamos tendo problemas com o Oracle deixar de responder. Achamos que isso acontece porque estamos atingindo o limite máximo de processo no oracle. Aumentamos o limite do processo, mas agora estamos atingindo a pressão da memória no servidor oracle. Nós temos toneladas de sessões oracle ociosas. Eu posso rastrear um monte deles de volta aos processos do httpd.

O Apache :: DBI do mod_perl inicia uma nova conexão com o banco de dados com cada filho httpd gerado. Estamos preocupados que nem sempre eles sejam fechados corretamente quando a saída do httpd ... e os httpd estão saindo muito com freqüência. Eu sei que seria bom modificar os aplicativos mod_perl para usar alguma forma melhor de pooling de conexões do banco de dados; planejamos seguir isso, mas gostaríamos de resolver nosso problema imediato mais cedo.

Então, aqui está a questão principal.

Estamos usando o MPM prefork.

Os processos filhos do apache duram no máximo alguns minutos . Análise de log mostra que cada um está servindo menos de 50 clientes antes de sair; a última solicitação que cada filho atende é OPTIONS * HTTP/1.0 em algum tipo de conexão interna; Tenho a impressão de que isso é um "ping" do processo mestre.

Eu ajustei a configuração do MPM da seguinte forma. Eu não queria elevar o MinSpareServers muito alto, porque, afinal, estou tentando minimizar o número de sessões para o oracle.

MinSpareServers       5
MaxSpareServers       30
MaxClients            150
MaxRequestsPerChild   10000

Neste momento, estamos atendendo a 250 a 300 solicitações por minuto.

Temos 21 httpd em execução, o mais velho (exceto o master, de propriedade de root) com 3 minutos de duração.

Esta taxa de colheita das crianças apache realmente parece excessiva. O que poderia estar causando isso?

O Apache foi construído com:

  $ ./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

Informações de configuração do 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"

módulos são compilados no apache em vez de bibliotecas compartilhadas:

% /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

Uma observação final - todos os pacotes httpd, apr e perl da red hat estão todos instalados, mas o ldd mostra que nenhuma dessas bibliotecas está vinculada ao httpd em execução.

    
por Dan Pritts 06.09.2012 / 06:30

1 resposta

0

aaargh

a resposta neste caso é que eu não configurei o apache com as opções maxrequestsperchild, minspareservers e maxspareservers.

Eu modifiquei um arquivo de configuração que acreditava ser Include d no arquivo principal, mas não era. Novo neste site e configuração antiga do crufty. suspiro.

Portanto, o comportamento que eu descrevo é o padrão compilado (eu verifiquei triplamente; ele não está sendo definido em nenhum outro lugar). A documentação sugere que esses são os padrões compilados:

link

link

MaxRequestsPerChild 10000
MaxSpareServers 10
MinSpareServers 5

Acho que o comportamento que vi não foi consistente com esses padrões. Vou arquivar um bug com o apache.

Acho que essa ainda é uma pergunta útil para deixar no site, porque o comportamento padrão não corresponde à documentação. Se os outros discordarem, vou encerrar minha pergunta com prazer.

    
por 07.09.2012 / 19:26