Como forçar o apache a descartar solicitações após um período de tempo predeterminado?

1

Estou configurando um sistema com requisitos rígidos no tempo de resposta. Como faço para forçar o Apache2 a descartar as solicitações na fila após 200ms se ele não tiver sido atendido?

Plano de fundo

Um dos nossos serviços internos precisa interagir com outro serviço. O outro serviço requer que façamos todas as respostas dentro de um prazo muito curto. Para um pequeno número de consultas, podemos atender à solicitação dentro do prazo desejado. No entanto, quando o sistema é carregado com muitas solicitações, o tempo de resposta realmente sofre.

Como a carga será praticamente contínua, obtemos uma situação de congestionamento de tráfego em que as consultas mais antigas estão sendo enfileiradas e, em seguida, atendidas, mas até lá a solicitação já expirou. Como posso ter certeza de que atendemos a solicitação dentro do tempo limitado atribuído ou simplesmente descartamos a solicitação?

    
por Loading 23.09.2013 / 23:31

2 respostas

1

O Apache httpd tem um botão de tempo limite, TimeOut que lida com tempo limite para enviar e receber TCP ações se o cliente não estiver enviando dados para o servidor em tempo hábil (e algumas outras coisas). Isso é fornecido na segunda granularidade e o padrão é 300 segundos. O que isso não fará é tempo limite de uma solicitação que leva 5 segundos para ser processada localmente.

A única fila em httpd é o ListenBacklog para solicitações que Sente-se no socket listen backlog que aguarda para ser atendido por um thread / child de trabalhador do httpd atualmente ocupado. Seu "tempo" de acordo com o Apache não começa até que eles são apanhados por um trabalhador. Você pode usar uma pequena configuração ListenBacklog para que novas solicitações sejam recusadas quando o servidor for iniciado indo devagar. Na verdade, se seus clientes estiverem encerrando a conexão após 200ms, isso provavelmente não importará, já que as solicitações de backlog nunca serão iniciadas corretamente como solicitações http.

As conexões só entram no backlog quando você tem MaxClients ou ServerLimit / ThreadLimit / TheadsPerChild conexões atualmente em uso. Você pode ajustá-los a um nível em que seu serviço seja capaz de sobreviver melhor.

Caso contrário, as solicitações estão sendo manipuladas por um filho / segmento httpd worker e não estão produzindo uma resposta http em < 200ms que eu suspeito é o que você está correndo. Se a resposta for tratada com "em processo" em httpd , não há muito o que fazer além de consertar qualquer coisa que acione o problema. Se você tiver um aplicativo em execução em httpd produzindo as respostas, como ele reagiria se httpd cortasse a conexão? Como o banco de dados, se estiver abaixo, lida com a conexão cortada? Geralmente, eles continuam sem o conhecimento necessário para concluir a solicitação até que tentem e gravem dados em um soquete no final. Lidar com timeouts é algo que precisa ser tratado em sua pilha em cada nível, para que funcione de ponta a ponta.

Nos níveis em que você está falando, acho que você precisaria de algo totalmente diferente de httpd para atender às suas necessidades. Talvez o Mongrel2 com sua distribuição de trabalho baseada em fila pudesse lidar com o timeouts de front end mais facilmente? Talvez um servidor http baseado em eventos possa lidar com os tempos limite ?. Como David menciona, mesmo o TCP poderia ter dificuldades para entregar nos níveis que você está pedindo. O componente TCP da solicitação nem conta para os tempos limite do nível do aplicativo do lado do servidor que você implementa, a menos que você tenha alguns smarts construídos que calculam tempos de ida e volta (o que o http não faz).

    
por 25.09.2013 / 00:05
0

Desculpe, isso não é sensato. O TCP simplesmente não foi feito para fornecer um serviço de baixa latência. Coisas como o ACK atrasado e o algoritmo de Nagle interagem para torná-lo inadequado para aplicações em que a latência deve ser baixa.

    
por 23.09.2013 / 23:34