Servidor Apache que não responde

Servidor Apache que não responde

Hospedamos nosso serviço web em um servidor dedicado.

Durante o período de alta carga, o servidor retorna um erro de tempo limite em vez de uma página com muita frequência.

Temos cerca de 170.000 solicitações diárias.

Porém, o servidor tem muita memória livre e a CPU não está carregada no momento.

Não consigo entender por que o servidor funciona mal.

Criei um perfil do caso do problema com o utilitário tcpdump. Estas são as sessões boas e ruins rastreadas pelo tcpdump. A solicitação é a mesma em ambos os experimentos.

Good - server returns response.

Bad - no response, time-out error.

Você vê por que o problema acontece a partir desses dados? Como posso avançar para me aproximar da origem do erro?

Substituí meu endereço IP real por 123.45.67.890

---- Bad ----
12:23:36.366292 IP 123.45.67.890.61749 > myserver.superbservers.com.www: S 2125316338:2125316338(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:23:39.362394 IP 123.45.67.890.61749 > myserver.superbservers.com.www: S 2125316338:2125316338(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:23:45.365567 IP 123.45.67.890.61749 > myserver.superbservers.com.www: S 2125316338:2125316338(0) win 8192 <mss 1460,nop,nop,sackOK>
--------

---- Good ----
12:27:07.632229 IP 123.45.67.890.63914 > myserver.superbservers.com.www: S 3581365570:3581365570(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:27:10.620946 IP 123.45.67.890.63914 > myserver.superbservers.com.www: S 3581365570:3581365570(0) win 8192 <mss 1460,nop,wscale 2,nop,nop,sackOK>
12:27:10.620969 IP myserver.superbservers.com.www > 123.45.67.890.63914: S 2654770980:2654770980(0) ack 3581365571 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 6>
12:27:10.838747 IP 123.45.67.890.63914 > myserver.superbservers.com.www: . ack 1 win 4380
12:27:10.957143 IP 123.45.67.890.63914 > myserver.superbservers.com.www: P 1:213(212) ack 1 win 4380
12:27:10.957152 IP myserver.superbservers.com.www > 123.45.67.890.63914: . ack 213 win 108
12:27:10.965543 IP myserver.superbservers.com.www > 123.45.67.890.63914: P 1:630(629) ack 213 win 108
12:27:10.965621 IP myserver.superbservers.com.www > 123.45.67.890.63914: F 630:630(0) ack 213 win 108
12:27:11.183540 IP 123.45.67.890.63914 > myserver.superbservers.com.www: . ack 631 win 4222
12:27:11.185657 IP 123.45.67.890.63914 > myserver.superbservers.com.www: F 213:213(0) ack 631 win 4222
12:27:11.185663 IP myserver.superbservers.com.www > 123.45.67.890.63914: . ack 214 win 108
--------

Detalhes sobre o serviço.

Este é um serviço de previsão do tempo. Está escrito em Perl, apoiado por MySQL. O script utiliza vários módulos (do CPAN e dos nossos).

O código é relativamente simples. O script baixa a previsão do tempo de outro servidor, converte o formato dos dados e retorna uma resposta XML. O clima é armazenado em cache no MyISAM DB. Existe um banco de dados de localizações mundiais (INNODB) que também pode ser solicitado através do script.

Estas são as métricas obtidas durante o período de alta carga.

Tráfego médio: 3MBit/seg

Número médio de pacotes: 3300 pacotes/seg

Hoster: SuperbHosting

SO: Ubuntu

Parâmetros do servidor: E6300 CONROE 1.86GHZ 2 X 1MB CACHE 1066 1GB DDR2 667MHZ

Este é um link para o arquivo de configuração do Apache que usamos http://repkin5.snow.prohosting.com/apache.txt

Este é o relatório de status do servidor obtido logo após o erro de tempo limite. http://repkin5.snow.prohosting.com/server-status.htm Existem apenas 10 Servidores Filhos em execução em 120, portanto há espaço suficiente para novas solicitações.

Instantâneo do programa principal durante o período de alta carga.

------
top - 13:21:29 up 15 days, 18:36,  1 user,  load average: 0.18, 0.19, 0.21
Tasks: 137 total,   1 running, 136 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.8%us,  1.2%sy,  0.0%ni, 92.8%id,  0.7%wa,  0.0%hi,  3.5%si,  0.0%st
Mem:   1033904k total,   590620k used,   443284k free,     6892k buffers
Swap:  3028212k total,    82556k used,  2945656k free,    64156k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 4252 mysql     20   0  162m  48m 3352 S    1  4.8 279:01.27 mysqld
14503 www-data  20   0 43280  14m 3824 S    1  1.4   0:00.16 apache2
14577 www-data  20   0 43012  13m 3500 S    1  1.4   0:00.06 apache2
14401 www-data  20   0 45076  17m 4340 S    0  1.8   0:00.46 apache2
14414 www-data  20   0 45516  18m 4344 S    0  1.8   0:00.47 apache2
14420 www-data  20   0 45624  18m 4372 S    0  1.8   0:00.61 apache2
14421 www-data  20   0 45488  18m 4352 S    0  1.8   0:00.42 apache2
14496 www-data  20   0 44820  17m 4328 S    0  1.7   0:00.18 apache2
14510 www-data  20   0 45216  17m 4300 S    0  1.8   0:00.62 apache2
    1 root      20   0  2844  456  404 S    0  0.0   0:05.24 init
    2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S    0  0.0   0:00.24 migration/0
    4 root      15  -5     0    0    0 S    0  0.0  32:28.85 ksoftirqd/0
    5 root      RT  -5     0    0    0 S    0  0.0   0:00.77 watchdog/0
    6 root      RT  -5     0    0    0 S    0  0.0   0:00.15 migration/1
    7 root      15  -5     0    0    0 S    0  0.0   0:03.07 ksoftirqd/1
    8 root      RT  -5     0    0    0 S    0  0.0   0:00.63 watchdog/1
-----

Responder1

Às vezes temos um comportamento estranho com um servidor que é muito legal ("uptime" lhe dirá), mas que se torna muito irresponsivo. Uma forma de verificar é usar "netstat", ver quantas linhas você tem. Você também pode tentar o mod_status do Apache. Nosso problema ainda não está muito claro, mas certamente vem do mundo exterior, ou seja, da conectividade do datacenter. Uma máquina perto de você pode estar consumindo toda a largura de banda ou até mesmo filtrando os pacotes antes que eles cheguem até você, daí a lentidão percebida.

Não tenho certeza se isso se aplica a você, mas aparentemente você não tem uma carga alta nas CPUs enquanto muitos processos do Apache esperam por algo, talvez esperem por respostas de fora ... Se você tiver "sar", isso também pode ajudar.

Responder2

O que não foi descrito é o que esse serviço web realmente éprojetado/escrito para fazer. Freqüentemente, o código do aplicativo executado em threads simultâneos pode formar algum nível de contenção por recursos comuns ou aguardar algum recurso de back-end que seja um gargalo. Portanto, mesmo que a utilização da memória ou do processador possa não ser alta, a limitação desses outros recursos comuns pode paralisar ou atrasar o processamento e, portanto, a resposta oportuna de outros threads.

Qual plataforma de aplicativo está baseada no Apache para realizar o trabalho? bem como o ponto de recurso final necessário para atender à solicitação de serviço da web? Se um banco de dados back-end estiver envolvido, é provável que haja um conflito de consulta no servidor de banco de dados.

Responder3

Existem duas seções em seu arquivo /etc/apache2/apache.conf em mpm_prefork_module e mpm_worker_module

StartServers          5  
MinSpareServers       5  
MaxSpareServers      10  
MaxClients          150    
MaxRequestsPerChild   0  

Talvez seja necessário ajustar essas seções de acordo com seu ambiente para lidar com mais solicitações.

informação relacionada