o servidor web apache não responde com o status do servidor mostrando todos os processos filhos esperando por conexão

9

Minha configuração: Eu tenho 3 máquinas de servidor da Web quase idênticas que servem o mesmo site dinâmico de alta carga com balanceamento de carga simples sobre o DNS. O serviço está funcionando há mais de dois anos com a mesma configuração do apache. apache2, php5, ubuntu 8.04 linux 2.6.24-29-server

Meu problema: desde cerca de duas semanas eu estou tendo problemas com essa configuração. Quase todos os dias eu tenho um pequeno momento de cerca de 5 minutos, em que o site é inacessível. Eu ainda sou capaz de acessar os servidores através do ssh. Se eu correr htop, vejo a máquina simplesmente sem fazer nada. Eu tenho cerca de 1000 processos apache em execução, mas nenhuma atividade de CPU.

Eu usei o mod_status do apache para depurar esta situação. o placar do processo se parece com isso:

_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

Portanto, a maioria dos processos está apenas esperando por conexão. após cerca de 5 minutos a situação voltará ao normal: tenho muito menos processos em todas as máquinas, a maioria dos trabalhadores tem o status "." (estão abertos para processar uma solicitação) e, claro, o site é acessível!

Então, estou tentando encontrar algo nos logs, mas simplesmente não há nada ... o log de acesso do apache fica em silêncio por cerca de 4 minutos, o mesmo é para o log de erros. Eu também não consigo descobrir nada de errado em outros registros do sistema.

a situação é a mesma em todos os 3 servidores da Web (todos eles têm esse pico de carga e a condição de não responder ao mesmo tempo), então não acho que isso esteja relacionado a hardware. mas acho que isso pode estar relacionado a algum problema de rede (tcp).

alguma ideia?

EDITAR: mais algumas informações, que acabei de descobrir:

acabou de acontecer novamente. e eu fui capaz de verificar que também não consigo me conectar localmente quando esse problema ocorre. Eu fiz algumas estatísticas de conexão com o seguinte comando depois que aconteceu netstat -an | awk '/ tcp / {print $ 6}' | classificar | uniq -c

  • 109 CLOSE_WAIT
  • 2652 ESTABELECIDO
  • 2 FIN_WAIT1
  • 11 LAST_ACK
  • 12 ESCUTA
  • 91 SYN_RECV
  • 1 SYN_SENT
  • 16 TIME_WAIT

Se eu executar o mesmo comando algum tempo depois, eu tenho algo assim:

  • 4 FECHANDO
  • 108 ESTABELECIDO
  • 18 FIN_WAIT1
  • 182 FIN_WAIT2
  • 37 LAST_ACK
  • 12 ESCUTA
  • 50 SYN_RECV
  • 11276 TIME_WAIT

Portanto, na situação normal eu tenho apenas 100-200 conexões abertas por clientes sendo manipulados pelo apache neste momento. Quando eu tenho esse "crash", eu tenho muito mais conexões. Qual é a melhor maneira de analisar isso?

EDIT2: as linhas importantes no apache2.conf são:

KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit           920
StartServers          30
MinSpareServers       80
MaxSpareServers      120
MaxClients          920
MaxRequestsPerChild   700
</IfModule>

é um prefork do apache2 com o php_mod.

o servidor tem 8 GB de ram e uma partição swap de 4 gb.

    
por Jeff 31.01.2012 / 13:24

4 respostas

2

Você deve ativar o status estendido de mod_status ( link ) para monitorar o status hosts e solicitações atuais sendo processados. Eu acho que há um script (s) / página (s) que leva muito tempo para liberar a conexão e faz o empilhamento de conexões.

    
por 04.03.2015 / 19:40
1

Primeiro: verifique seu Max open files limite no processo. Uma conexão de soquete ativo conta como um arquivo aberto. cat /proc/###/limits é uma boa maneira de verificar o valor efetivo de outro processo. Você pode obter uma lista de arquivos abertos com lsof -p ### , em que ### é o ID do processo do servidor da web. Você pode comparar lsof -p ### | wc -l para ver o quanto está chegando ao limite. Você também deve ver mensagens no error_log do apache se estiver atingindo o limite.

Você precisa de um identificador de arquivo para cada conexão de soquete e também para cada script cgi ou referência de arquivo de dados. Para 920 MaxClients, você deve configurar pelo menos 4.000 arquivos para o processo httpd. Você pode aumentar o número de arquivos adicionando um arquivo em /etc/security/limits.d/ com o seguinte conteúdo. Certifique-se de que o nome do usuário corresponda ao que você está usando para seu servidor da Web.

apache soft nofile 10000
apache hard nofile 10000

Segundo: Se a exaustão de porta é problema seu, você pode ajustar algumas configurações de ip em /etc/sysctl.conf. (Começando com net.ipv4.tcp_fin_timeout ). Isso geralmente é um problema apenas com muitas conexões muito pequenas. Muitos soquetes TIME_WAIT são um indicador disso, mas isso indica esgotamento de portas apenas quando acompanhados por erros no syslog sobre possible SYN flooding e Sending cookies . Você também deve garantir que seu servidor esteja protegido por um firewall que possa impedir ataques SYN maliciosos.

    
por 26.12.2014 / 06:21
0

Mostre as configurações do seu apache MPM e salve as configurações.

Provavelmente é uma combinação ruim disso.

EDIT: Acabei de ver você mencionou php.

Se este é o mod_php que você está usando, é melhor que essa máquina tenha 64GB de memória, ou você nunca conseguirá manter 2500 conexões.

    
por 01.02.2012 / 15:17
0

Além disso, tenha em mente que no prefork MPM, cada processo terá PHP em seu espaço de memória (qual é a configuração de limite de memória?). Você pode gostar de tentar mudar para o worker MPM, o que pode exigir um módulo PHP ligeiramente diferente.

Também vale brinco remoto para cortar sua configuração do Apache de módulos estranhos

Na minha experiência, essas coisas são acionadas por coisas como um rastreador do mecanismo de pesquisa ou coisas como conflitos de ARP. Ou níveis de tráfego em alguma parte relacionada da rede.

Você pode achar o 'sar' útil ... não o mais amigável, mas certamente útil.

Possivelmente também relacionado a io. Sar pode lhe dizer (se você configurá-lo para registrar a atividade do disco), qual é o tempo médio de espera do io. Você também pode olhar para o IO Wait time in top (que é uma porcentagem, leia o que realmente significa). Isso pode ser significativo se você estiver usando uma SAN ou um ambiente virtual.

    
por 09.05.2014 / 10:33