NGINX: Solicitud Limitar el comportamiento del tiempo de espera para consultas en la cola (ráfaga)

NGINX: Solicitud Limitar el comportamiento del tiempo de espera para consultas en la cola (ráfaga)

Actualmente, tenemos un tamaño de cola de 3000 solicitudes.

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

El límite de velocidad es de 10 solicitudes por segundo.

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

El tiempo de espera de Keep-Alive es de 30 segundos. En otras palabras, se deben rechazar 2700 solicitudes con el código de error 408 cada 30 segundos, cuando la cola está llena.

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

En las horas pico, no pude encontrar ninguna solicitud en los registros, que NGINX rechazó con el código de error 408, debido a un tiempo de espera, mientras la solicitud estaba esperando en la cola para reenviarse al contenedor de servlets. Rechace únicamente con el código de error 503, que corresponde a la sobrecarga de la tasa de solicitudes.

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

¿NGINX rechaza las solicitudes en dichas colas por tiempo de espera, si permanecen demasiado tiempo? ¿Qué es este tiempo de espera? ¿Dónde está su configuración?

Respuesta1

Parece que hay un poco de confusión sobre cómo funcionan la limitación de velocidad y los tiempos de espera de nginx. No hayse acabó el tiempopara limitar la tasa. Simplemente establece una tarifa y un tamaño de cola. Cualquier solicitud que supere la tarifa se agregará a la cola para procesarse más adelante. Una vez que la cola esté completamente llena, cualquier solicitud adicional será rechazada con un código de estado 503.


en tu ejemploha establecido una velocidad de 10 solicitudes por segundo (10 r/s), un tamaño de ráfaga de 3000 y una zona "explotada" con un tamaño de 10 megabytes. Y este límite de velocidad se aplica como un recuento separado para cada servidor definido.

En otras palabras, su servidor acepta y procesa una solicitud cada 0,1 segundo y puede poner en cola hasta 3000 solicitudes excedentes, que luego se procesan a la velocidad definida: una cada 0,1 segundo. Y su zona de ráfaga puede almacenar alrededor de 160.000 direcciones IP.

Eso significaSi llegan 3011 solicitudes en un segundo, nginx procesa las primeras 10 solicitudes inmediatamente, coloca otras 3000 solicitudes en la cola y la solicitud número 3011 será rechazada con un código de estado 503. Luego, la cola se procesará a la velocidad definida de una solicitud cada 0,1 segundo. Mientras no lleguen nuevas solicitudes, la cola se acortará y se podrán agregar nuevas solicitudes a la cola nuevamente. Pero aunque la cola ya contiene 3000 solicitudes, cada solicitud adicional será rechazada con un código de estado 503.

Este comportamiento de procesamiento lineal de la cola de ráfaga puede hacer que su sitio parezca lento. Para evitarlo, puede agregar el nodelayparámetro a limit_req zone=bursted burst=3000 nodelay;. Esto hará que todas las solicitudes de su cola de ráfaga se procesen inmediatamente mientras se marcan los espacios en la cola como "ocupados" y luego se "liberan" espacio por espacio nuevamente a la velocidad definida, de modo que el límite de velocidad definido se cumpla con el tiempo.

Por cierto: puede cambiar el código de estado para solicitudes rechazadas de 503 a 444 agregándolo limit_req_status 444;a su httpbloque de configuración.

Para más detalles ver:


Los dos tiempos de espera de su configuración:

Hará client_body_timeout 10;que su servidor espere hasta 10 segundos para que se envíe el cuerpo del cliente después de una solicitud. Si el cliente no envía ningún cuerpo dentro de este tiempo, el servidor cerrará la conexión con un código de estado 408.

Esto keepalive_timeout 30;hará que su servidor cierre cualquier conexión con un cliente que aún esté abierta después de 30 segundos. Pero según mis pruebas, el tiempo que una solicitud espera en la cola de ráfaga no cuenta para keepalive_timeout.


Realizar pruebas de cargausandoabocerco.

información relacionada