Tentando entender como funciona o keep-alive

4

Hoje encontramos um problema no servidor quando arquivos / scripts demoraram mais de 3 segundos para serem carregados. A solução foi simples - apenas aumentando o MaxClients para o limite de memória estimado. Mas eu estou preocupado com a escalabilidade dessa solução e ela não parece muito confiável - deve carregar um pouco, o problema ocorrerá novamente.

A natureza do serviço web que estamos desenvolvendo - pequeno jogo online - nos obriga a incorporar o mecanismo AJAX que envia um sinalizador a cada 15 segundos, indicando que o cliente está on-line.

Vamos imaginar seguindo a configuração. Apache 2 (mpm_prefork), MaxClients = 150, KeepAlive = on, KeepAliveTimeout = 5. Existem 300 usuários online. Eu entendo isso corretamente - se todos os 300 usuários enviarem um beacon simultaneamente (apenas recuperando o script beacon.php usando POST) - os primeiros 150 clientes receberão uma resposta quase que momentaneamente, enquanto outros 150 terão que esperar por 5 segundos antes de obter um responder?

E segunda pergunta. Qual é a melhor solução no meu caso? Desativando manter vivo em tudo?

    
por user1065145 31.07.2013 / 13:21

2 respostas

5

MaxClients no apache 2 é o número máximo de solicitações simultâneas que serão atendidas em todos os processos do apache. Com o prefp mpm, esse também é o número máximo de processos apache que serão executados de forma concisa e o número máximo de conexões de rede de entrada abertas para seu servidor web.

O ponto principal do KeepAlive é reduzir a sobrecarga de iniciar novas conexões TCP para cada solicitação HTTP ao acessar um site, já que cada nova página pode potencialmente exigir dezenas de documentos (html inicial, css, javascript, imagens, etc). O resultado final são páginas que carregam mais rápido.

MaxKeepAliveTimeout indica por quanto tempo o servidor da Web aguardará uma solicitação adicional de hHT de um cliente inativo antes de fechar a conexão, permitindo que ele atenda a novas conexões de desconexão.

No seu caso, se você tiver 150 clientes enviando o beacon de uma vez com o KeepAlive ativado, então sim, levará mais 5 segundos antes que outros usuários possam entrar. Supondo um requisito de envio de um beacon a cada 15 segundos é 450 max. Comercial.

Soluções:

  • você pode reduzir o MaxKeepAliveTimeout para 2 segundos, e há retornos decrescentes quando é aumentado. O benefício máximo é para carregamentos de página iniciais e praticamente não há atraso entre essas solicitações.

  • você pode desativar totalmente o KeepAlive, aumentando o tempo de carregamento de todas as suas páginas, supondo que a maioria dos usuários passe a maior parte do tempo no jogo.

  • keepalive tem que ser ativado no lado do cliente, assim como no lado do servidor a ser usado. Assumindo que você controla o javascript do lado do cliente, é possível desativar o keepalive no lado do cliente para uma solicitação específica, usando:

    connection.setRequestProperty("Connection", "close");
    
  • Da mesma forma, você pode desativar o Keepalive para solicitações HTTP específicas no lado do servidor, manipulando o cabeçalho de resposta da conexão.

Espero que isso ajude!

    
por 31.07.2013 / 14:11
1

Todo o conceito de como o mecanismo keep-alive do Apache2 funciona está muito bem descrito neste artigo Tuning Apache

Você precisa encontrar algum equilíbrio entre os valores MaxClients e KeepAliveTimeout para usar esse recurso. Aumentar o primeiro de acordo com a memória disponível no servidor ou diminuir o segundo.

    
por 31.07.2013 / 14:33