Minha configuração: tenho três máquinas de servidor da web quase idênticas, que atendem ao mesmo site dinâmico carregado com um simples balanceamento de carga sobre o DNS. O serviço trabalha 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: há cerca de duas semanas, estou tendo problemas com esta configuração. Quase todos os dias, tenho um pequeno momento por cerca de 5 minutos, no qual o site é inacessível. Ainda consigo fazer login nos servidores pelo ssh. Se eu correr htop
, vejo a máquina simplesmente não fazendo nada. Eu tenho cerca de 1000 processos apache em execução, mas nenhuma atividade da CPU.
Eu usei o apache mod_status para depurar essa situação. O placar do processo é assim:
_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 aguardando conexão. Após cerca de 5 minutos, a situação voltará ao normal: eu tenho muito menos processos em todas as máquinas, a maioria dos trabalhadores tem o status "." (porque eles estão abertos para processar uma solicitação) e, é claro, o site é acessível!
Então, eu 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 logs do sistema.
a situação é a mesma em todos os três servidores da web (todos eles têm esse pico de carga e condição sem resposta ao mesmo tempo), então não acho que isso esteja relacionado ao hardware. mas acho que isso pode estar relacionado a algum problema de rede (tcp).
alguma ideia?
EDIT: mais algumas informações, que acabei de descobrir:
Acabou de acontecer novamente e pude verificar que também não consigo conectar localmente quando esse problema ocorre.
Fiz algumas estatísticas de conexão com o seguinte comando depois que aconteceu: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 ESTABELECIDO
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12 OUVIR
- 91 SYN_RECV
- 1 SYN_SENT
- 16 TIME_WAIT
Se eu executar o mesmo comando algum tempo depois, tenho algo parecido com isto:
- 4 ENCERRAMENTO
- 108 ESTABELECIDO
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LAST_ACK
- 12 OUVIR
- 50 SYN_RECV
- 11276 TIME_WAIT
Portanto, na situação normal, tenho apenas 100-200 conexões abertas de clientes sendo manipuladas pelo apache neste momento. Quando tenho esse "travamento", 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 php_mod.
O servidor possui 8 GB de RAM e uma partição de swap de 4 GB.
tcpdump
) o ajude a chegar à raiz do problema ... entre as políticas de firewall e uso de memória?