NGINX: comportamento do limite de solicitação para consultas na fila (burst)

NGINX: comportamento do limite de solicitação para consultas na fila (burst)

Atualmente, temos uma fila de 3.000 solicitações.

location /api/v2 {
     limit_req zone=bursted burst=3000;
     include /etc/nginx/proxy.conf;
 }

O limite de taxa é de 10 solicitações por segundo.

 limit_req_zone $limit zone=api_slow:10m rate=1r/s;
 limit_req_zone $server_name zone=bursted:10m rate=10r/s;

O tempo limite do Keep-Alive é de 30 segundos. Em outras palavras, 2.700 solicitações devem ser rejeitadas com código de erro 408 a cada 30 segundos, quando a fila estiver cheia.

 reset_timedout_connection on;
 client_body_timeout 10;
 send_timeout 2;
 keepalive_timeout 30;

Em horários de pico, não consegui encontrar nenhuma solicitação nos logs, que foi rejeitada com o código de erro 408 pelo NGINX, devido a um tempo limite, enquanto a solicitação aguardava na fila para encaminhamento ao contêiner do servlet. Rejeite apenas com o código de erro 503, que corresponde ao overhead da taxa de solicitações.

delaying request, excess: 2958.320, by zone "bursted"
limiting requests, excess: 3000.730 by zone "bursted"

O NGINX rejeita solicitações nessas filas por tempo limite, se elas ficarem suspensas por muito tempo? O que é esse tempo limite? Onde está sua configuração?

Responder1

Parece que há um pouco de confusão sobre como funcionam a limitação de taxa e os tempos limite do nginx. Não hátempo esgotadopara limitação de taxa. Você acabou de definir uma taxa e um tamanho de fila. Quaisquer solicitações que excedam a taxa serão adicionadas à fila para serem processadas posteriormente. Assim que a fila estiver completamente preenchida, qualquer solicitação adicional será rejeitada com um código de status 503.


No seu exemplovocê definiu uma taxa de 10 solicitações por segundo (10r/s), um tamanho de intermitência de 3.000 uma zona 'interrompida' com um tamanho de 10 megabytes. E esse limite de taxa se aplica como contagem separada para cada servidor definido.

Em outras palavras, seu servidor aceita e processa uma solicitação a cada 0,1 segundo e pode enfileirar até 3.000 solicitações excedentes, que são então processadas na taxa definida: uma a cada 0,1 segundo. E sua zona de burst pode armazenar cerca de 160.000 endereços IP.

Que significase 3.011 solicitações chegarem em um segundo, o nginx processará as primeiras 10 solicitações imediatamente, colocará outras 3.000 solicitações na fila e a 3.011ª solicitação será rejeitada com um código de status 503. A fila será então processada na taxa definida de uma solicitação a cada 0,1 segundo. Enquanto nenhuma nova solicitação chegar, a fila ficará mais curta e novas solicitações poderão ser adicionadas à fila novamente. Mas, embora a fila já contenha 3.000 solicitações, cada solicitação adicional será rejeitada com um código de status 503.

Esse comportamento linear do processamento da fila intermitente pode fazer com que seu site pareça lento. Para evitar isso, você pode adicionar o nodelayparâmetro ao limit_req zone=bursted burst=3000 nodelay;. Isso fará com que todas as solicitações da sua fila burst sejam processadas imediatamente, marcando os slots na fila como 'ocupados' e, em seguida, 'liberando' slot por slot na taxa definida novamente, para que o limite de taxa definido seja atendido ao longo do tempo.

aliás: você pode alterar o código de status para solicitações rejeitadas de 503 para 444 adicionando limit_req_status 444;ao seu httpbloco de configuração.

Para mais detalhes consulte:


Os dois tempos limite da sua configuração:

Isso client_body_timeout 10;fará com que seu servidor espere até 10 segundos para que um corpo do cliente seja enviado após uma solicitação. Se nenhum corpo for enviado pelo cliente dentro desse período, o servidor fechará a conexão com um código de status 408.

Isso keepalive_timeout 30;fará com que seu servidor feche qualquer conexão com um cliente que ainda esteja aberto após 30 segundos. Mas, de acordo com meus testes, o tempo que uma solicitação aguarda na fila burst não conta para keepalive_timeout.


Realize testes de cargausandoaboucerco.

informação relacionada