Apache: “Servidor parece ocupado”, mas muitos processos inativos

1

Eu devo notar que eu não sou um administrador de sistemas. Você vai descobrir isso muito em breve. :)

Em poucas palavras: O Apache continua respirando durante cargas pesadas e todos os processos ficam inativos. Este é um servidor de pesquisa usado por aplicativos. As pesquisas vêm de um lote de diferentes endpoints. De tempos em tempos (a cada 4-5 minutos), se eu estiver assistindo no topo, os processos HTTPD ficam ociosos todos ao mesmo tempo, atrasando o tráfego por 10 segundos ou mais. Em seguida, ele se recupera. O atraso é problemático.

  • O servidor está atendendo muito tráfego. Estas são enquetes de aplicativos via HTTPS, não páginas da web (embora duvido que o Apache saiba a diferença)
  • As pausas mencionadas acima fazem com que o tráfego fique desequilibrado: depois de algum tempo, recebo um GRUPO DE TRÁFEGO INTEIRO, depois uma trégua, depois um BROQUE DE TRÁFEGO INTEIRO
  • Cada pesquisa requer um pequeno mergulho no banco de dados

Registros do Apache

Às vezes , mas nem sempre (principalmente após uma reinicialização), recebo essas mensagens em error_log. Na maioria das vezes quando isso acontece, não vejo nada no error_log.

[Mon Jun 30 17:55:17 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 8 children, there are 31 idle, and 98 total children
[Mon Jun 30 17:55:18 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 16 children, there are 14 idle, and 98 total children
[Mon Jun 30 17:55:44 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 8 children, there are 74 idle, and 99 total children
[Mon Jun 30 17:55:54 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 8 children, there are 61 idle, and 99 total children
[Mon Jun 30 17:56:00 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 8 children, there are 0 idle, and 97 total children
[Mon Jun 30 17:56:02 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 16 children, there are 36 idle, and 99 total children
[Mon Jun 30 17:56:03 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 32 children, there are 39 idle, and 99 total children
[Mon Jun 30 18:08:17 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 8 children, there are 18 idle, and 99 total children
[Mon Jun 30 18:08:18 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 16 children, there are 63 idle, and 98 total children
[Mon Jun 30 18:08:19 2014] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 32 children, there are 74 idle, and 97 total children

Apache Config (configuração antiga comentada)

apenas mostrando itens de configuração que eu suspeito serem relevantes

#Timeout 60
Timeout 20
KeepAlive on
MaxKeepAliveRequests 1000
KeepAliveTimeout 2

IfModule prefork.c
        StartServers            85
        MinSpareServers         85
        MaxSpareServers         100
        ServerLimit             100
        MaxClients              100
        #StartServers       60
        #MinSpareServers    60
        #MaxSpareServers    85
        #ServerLimit        85
        #MaxClients         85
        MaxRequestsPerChild 1000
/IfModule

Note que não há diferença entre as configurações antigas e novas no comportamento.

Ambiente EC2, c1.medium, mod_perl, conexões de banco de dados persistentes, servidor RDS separado, nenhum erro exibido nos logs de erro do MySQL e nenhum erro nos logs do Apache

Como um aparte, eu vi sugestões para instalar o mod-status, mas eu não descobri como fazer isso, e eu não sei o que procurar se eu fizer isso.

    
por Disco 30.06.2014 / 21:10

3 respostas

3

Mistério solucionado.

Caso isso aconteça com qualquer outra pessoa: A conexão de rede (dentro da interface VPC via LAN) entre o Apache e o servidor de banco de dados estava ficando congestionada. A atualização do servidor de banco de dados para uma instância maior resolveu o problema (por enquanto).

Segundo plano: a Amazon tira instantâneos de seu banco de dados a cada cinco minutos para o recurso de restauração de ponto no tempo. Ele faz o download do log binário em sua instância do RDS para fazer isso.

A cada 5 minutos, o log binário é transmitido (presumivelmente para outro EBS) e, no meu caso, essa transmissão congestionou a interface da LAN. O Apache empacota enquanto espera pela conexão de rede a cada cinco minutos, e as conexões se acumulam, com algumas abortando.

    
por 05.07.2014 / 18:52
1

Eu atualizaria a configuração MaxClients para cerca de 200 ...

.Além disso, estou curioso para saber por que os servidores sobressalentes Min e Max são tão altos. Eu provavelmente defini o MinSpareServers para algo como 20 e os MaxSpareServers para algo como 30. Esses são basicamente o número de processos ociosos que permanecem, o apache criará mais conforme necessário até a configuração MaxClients e reduzirá o número de processos sobressalentes conforme a demanda diminui.

Por fim, por que você está inicialmente criando tantos servidores iniciais? Eu começaria com algo como configurar StartServers para cerca de 50.

    
por 30.06.2014 / 21:24
0

Eu tive o mesmo problema, descobriu-se que foi causado por ter uma instância RDS underscaled. A CPU e a memória estavam sempre abaixo de 15%, então não me preocupei em atualizá-la até ler a resposta do OP.

Alterar a instância do RDS de t2.micro para t2.medium resolveu meu problema.

Foi realmente difícil solucionar problemas porque não é tão evidente a partir das estatísticas da instância, a única coisa que notei foram pequenos picos nos gráficos de largura de banda de entrada e saída.

    
por 10.06.2018 / 19:50