Como evitar efetivamente o enfileiramento de solicitações http (forçar uma resposta de erro imediata) acima de um limite no Apache

1

Às vezes, muitas solicitações http e, portanto, muitos processos httpd, "acumulam", o que significa que as primeiras demoram muito para responder, e as seguintes são enfileiradas, e demora uma eternidade para responder a todas elas, e, portanto, mais solicitações se acumulam, exponencialmente, até que todo o servidor entre em colapso.

Já tentei limitar os MaxClients a quase tantos quantos o servidor aguenta sem se contrair. No entanto, embora isso impeça o Apache de gerar mais processos, ele não parece evitar mais pedidos para se acumular.

Ou seja, se o MaxClients estiver limitado a 100, as solicitações 101 e seguintes não receberão um erro, mas, por algum motivo, elas são enfileiradas e aguardam até que o Apache possa gerar mais processos para lidar com elas. Então, isso só impede que o sistema operacional inteiro caia com o Apache, mas isso não evita a saturação do servidor da Web.

O que posso fazer para que, sendo N = MaxClients, a N + 1ª requisição que acha o servidor muito ocupado, receba imediatamente uma resposta de erro, ou seja imediatamente negada a conexão (em qualquer nível)?

Isso está no Debian, e o Apache está usando o prefork.

Como um aparte, apenas para mostrar por que estou assumindo que a abordagem acima poderia fazer sentido, verifiquei que quando esse efeito de avalanche acontece, se eu reiniciar o servidor apache (o que leva uma fração de segundo), o servidor imediatamente volta ao normal, mesmo se ainda estiver sob a mesma carga, e depois disso funcionará sem problemas, geralmente por um longo tempo até que uma nova "avalanche" aconteça. Por outro lado, se eu não fizer nada, o servidor nunca se recuperará.

    
por matteo 02.11.2015 / 21:11

0 respostas

Tags