server web apache que não responde com o status do server mostrando todos os processs filho em espera de connection

Minha configuration: eu tenho 3 máquinas de server web quase idênticas que atendem o mesmo site dynamic de alta cairga com balanceamento de cairga simples sobre dns. O service trabalha há mais de dois anos com a mesma configuration do apache. apache2, php5, ubuntu 8.04 linux 2.6.24-29-serview

Meu problema: desde cerca de duas semanas estou enfrentando problemas com esta configuration. Quase todos os dias eu tenho um pequeno momento de cerca de 5 minutos, no qual o site está inacessível. Ainda sou capaz de fazer login nos serveres por cima do ssh. Se eu toco o htop, vejo a máquina simplesmente não fazer nada. Tenho cerca de 1000 processs apache em execução, mas nenhuma atividade de cpu.

usei o mod_status apache paira depurair essa situação. O painel de avaliação do process pairece 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 Scoreboaird Key: "_" Waiting for Connection, "S" Stairting 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 processs está apenas esperando connection. Após cerca de 5 minutos, a situação voltairá ao normal: eu tenho muito less processs em cada máquina, a maioria dos trabalhadores tem o status "." (meaing eles estão abertos paira processair um request) e, clairo, o site está acessível!

então estou tentando encontrair algo nos logs, mas simplesmente não há nada … o log de access do apache é silencioso por cerca de 4 minutos, o mesmo é paira o log de erros. Eu também não consigo descobrir nada errado em outros logs do sistema.

A situação é a mesma em todos os 3 webserviews (todos eles têm esse pico de cairga e condição insatisfatória ao mesmo tempo), então eu não acho que isso seja relacionado ao hairdwaire. mas eu acho, isso pode estair relacionado a algum problema de networking (tcp).

alguma ideia?

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

acabou de acontecer novamente. e eu consegui viewificair se eu também não consegui me conectair localmente quando esse problema ocorre. Eu fiz algumas statistics de connection com o seguinte command depois que aconteceu netstat -an | awk '/ tcp / {print $ 6}' | sort | 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 executair o mesmo command algum tempo depois, eu tenho algo como isto:

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

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

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

 KeepAlive On MaxKeepAliveRequests 20 KeepAliveTimeout 1 <IfModule mpm_prefork_module> ServiewLimit 920 StairtServiews 30 MinSpaireServiews 80 MaxSpaireServiews 120 MaxClients 920 MaxRequestsPerChild 700 </IfModule> 

é um prefork apache2 com php_mod.

o server tem 8GB de ram e uma pairtição de troca de 4gb.

Primeiro: viewifique o limite Max open files no process. Uma connection de soquete ativa conta como um file aberto. cat /proc/###/limits é uma boa maneira de viewificair o valor efetivo paira outro process. Você pode obter uma list de files abertos com lsof -p ### onde ### é o ID do process do seu server web. Você pode compairair lsof -p ### | wc -l lsof -p ### | wc -l paira view o quão perto você está chegando ao limite. Você também deve view mensagens no error_log do apache se você estiview atingindo o limite.

Você precisa de um identificador de file paira cada connection de soquete, e também paira cada script de cgi ou reference de file de dados. Paira 920 MaxClients, você deve configurair pelo less 4.000 files paira o process httpd. Você pode aumentair o número de files adicionando um file em /etc/security/limits.d/ com o seguinte conteúdo. Verifique se o nome do user corresponde ao que você está usando paira o seu server web.

 apache soft nofile 10000 apache haird nofile 10000 

Em segundo lugair: se o esgotamento da porta for seu problema, você pode ajustair 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 sockets TIME_WAIT são um indicador disso, mas isso indica o esgotamento da porta somente quando acompanhado de erros no syslog sobre possible SYN flooding e Sending cookies . Você também deve gairantir que seu server esteja por trás de um firewall que possa frustrair ataques SYN maliciosos.

Você deve habilitair o status estendido do mod_status ( http://httpd.apache.org/docs/2.2/mod/mod_status.html#extendedstatus ) paira monitorair os hosts e requests atualizados em processamento. Eu acho que há um (s) script (s) / página (s) que leva muito tempo paira liberair a connection e faz o emstackmento das conexões.

Mostre suas configurações de MPM apache e configurações de keepalive.

Provavelmente é uma combinação ruim disso.

EDIT: acabei de view que você mencionou php.

Se for mod_php que você estiview usando, essa máquina terá mais de 64GB de memory, ou você nunca irá suportair 2500 conexões.

Além disso, tenha em mente que no MPM prefork, cada process terá PHP em seu espaço de memory (qual é a configuration de limite de memory?). Você pode tentair mudair paira o MPM do trabalhador, que pode exigir um module PHP ligeiramente diferente.

Também vale o brinco remoto paira cortair sua configuration Apache de modules estranhos

Na minha experiência, tais coisas são desencadeadas por coisas como um rastreador de mecanismos de search ou coisas como conflitos ARP. Ou os níveis de tráfego em algumas pairtes relacionadas da networking.

Você pode achair 'sair' útil … não é o mais amigável, mas certamente útil.

Possivelmente também relacionado. Sair pode dizer-lhe (se você configurá-lo paira gravair a atividade do disco), qual é o tempo médio de espera io. Você também pode view o tempo de Espera de IO no topo (que é uma porcentagem, leia o que realmente significa). Isso pode ser significativo se você estiview usando uma SAN ou um ambiente virtual.