Nginx: ¿cuál es el significado de definir 'burst' si existe la opción 'nodelay'?

14

En la configuración de Nginx, cuando desea limitar la velocidad de procesamiento de solicitudes utilizando limit_req_zone/ limit_req instructions, realmente no entiendo el uso de la nodelayopción.
Según tengo entendido, finaliza las solicitudes por encima de la tasa definida sin retrasarlas. Entonces parece equivalente a burst=0. Por eso no entiendo el siguiente ejemplo:

limit_req zone=one burst=5 nodelay;

burstdefine el número de solicitudes que podrían retrasarse, entonces, ¿cuál es el significado de definir burstsi existe la nodelayopción?

Nicolas
fuente

Respuestas:

28

Encuentro la limit_reqdocumentación lo suficientemente clara.

burst está documentado de esa manera:

Las solicitudes excesivas se retrasan hasta que su número excede el tamaño máximo de ráfaga [...]

nodelay está documentado de esa manera:

Si no se desea retrasar las solicitudes excesivas mientras las solicitudes están limitadas, se debe usar el parámetro nodelay

Las solicitudes están limitadas para ajustarse a la tasa definida. Si las solicitudes son entrantes a una tasa mayor, no se atenderá más que el número definido de solicitudes por unidad de tiempo . Luego debe decidir qué hacer con esas otras solicitudes.

  • De forma predeterminada (no burst, no nodelay), las solicitudes se rechazan con un error HTTP 503.
  • Con burst, apila el número definido de solicitudes en una cola de espera, pero no las procesa más rápido que las solicitudes definidas por tasa de unidad de tiempo .
  • Con bursty nodelay, la cola no estará esperando y las ráfagas de solicitud se procesarán de inmediato .
Bernard Rosset
fuente
3
Gracias por su aclaración, la documentación no es lo suficientemente clara para mí.
Nicolas
1
Edité mi respuesta para reflejar la documentación al citarla. Cada palabra se pondera cuidadosamente en la documentación de nginx para que sea conciso: eso es lo bueno de esto.
Bernard Rosset
3
Entonces, ¿cuál es la diferencia entre la limit_req_zone $binary_remote_addr zone=flood:10m rate=6r/s; limit_req zone=flood burst=0;que permite 6 solicitudes por segundo y la limit_req_zone $binary_remote_addr zone=flood:10m rate=1r/s; limit_req zone=flood burst=5 nodelay;que también permite 6 solicitudes por segundo?
Nicolas
2
Solo quiero confirmar sobre la respuesta de Bernard. Si lo que Bernard dijo que era correcto, con ráfaga y nodolay, la tasa de éxito del servidor web será mayor que las solicitudes definidas de vez en cuando, ¿verdad?
Jcyrss
2
@BernardRosset, ¿podría aclarar por favor que la "cola no estará esperando"? ¿Qué quiere decir con eso?
Denis Gorbachev
8

Los comentarios sobre la respuesta original parecen incorrectos.

La pregunta en cuestión es cuál es la diferencia entre, digamos, tasa = ráfaga de 6r / s = 0 y tasa = ráfaga de 1r / s = 5 nodos

Las respuestas son excelentes para explicar la diferencia cuando la opción de nodolay NO está presente, en cuyo caso, las solicitudes se ponen en cola con la ráfaga, y son 503 sin la ráfaga.

La respuesta original parece acertada: con nodelay, las solicitudes de ráfaga se procesan de inmediato. Y por lo tanto, la única implicación de esto es que NO hay diferencia entre especificar una ráfaga + nodolay vs. solo especificar un límite superior con busrt = 0 en primer lugar.

Por lo tanto, para responder de manera más sucinta a la pregunta OP: el significado de ráfaga cuando se especifica nodelay es lo mismo que especificar una velocidad mayor sin ráfaga.

fsm
fuente
Gracias por haber aclarado este punto, que efectivamente fue el motivo de mi pregunta.
Nicolas
Esto está mal. Lea mi respuesta + comentarios nuevamente. Si aún no lo ve, hagamos un boceto: 6r / s en ambas configuraciones proporcionadas por Nicolas en un comentario sobre mi respuesta. 1er segundo -> ambos escenarios servirán 6r, pero conf # 2 almacenará 5 en ráfaga. Segundo segundo y en adelante, sigue siendo el mismo para conf # 1 (todos los 6r servidos), pero conf # 2 habrá eliminado 1 del cubo de ráfaga de acuerdo con un consumo que se ajuste al límite de velocidad, dejando espacio para 1r en la cola. Los otros 5r se tiran a la basura.
Bernard Rosset
@BernardRosset: pero con nodelay, ¿eso no significa que esas solicitudes se procesan inmediatamente en lugar de ponerlas en cola?
siride
4

Con bursty nodelayespecificado, me resulta más fácil entender el mecanismo de esta manera (al revés de lo que generalmente se entiende):

  1. Usted permite un máximo de burstsolicitudes. Con $binary_remote_addrese es el número máximo de solicitudes que acepta de una dirección determinada. Cada solicitud aumenta un contador interno. Cuando el contador alcanza bursttodas las solicitudes adicionales, se deniegan (y el contador no aumenta más allá del burstvalor).
  2. Este contador se reduce continuamente a una velocidad especificada usando rate.

Esta lógica sugiere que tiene mucho sentido especificar un burstvalor alto (por ejemplo, 100 y más) y un ratevalor bajo (incluso algo así como 2r / s). Esto maneja la navegación normal (un lote de solicitudes paralelas seguidas de un período de silencio) mejor mientras protege contra el flujo continuo de solicitudes de bot.

Dan
fuente
1

Le hice la pregunta de Nicolas al tipo que escribió la siguiente publicación en el sitio web nginx. Limitación de velocidad NGINX . Su respuesta es la siguiente

En el límite de velocidad anterior, nginx aceptará solicitudes consecutivas a intervalos de 1/6 de segundo. no aceptará una ráfaga de solicitudes que no satisfagan ese intervalo de tiempo mínimo. Por otro lado, en la última definición, nginx aceptará una ráfaga de hasta 6 solicitudes, independientemente del intervalo de tiempo entre las solicitudes. Enlace de respuesta

Jardinero
fuente
Hola @Gardener y bienvenido en Server Fault. Gracias por su contribución bien elaborada. El enlace a la fuente es muy apreciado.
Marco
0

Basado en la excelente respuesta de Dan y en el código fuente de nginx , un resumen conciso del nodelaycomportamiento parece ser el siguiente:

  • burstes cuántas nuevas solicitudes concurrentes están permitidas.
  • ratees cuántas solicitudes nuevas concurrentes se vuelven viejas por unidad de tiempo. (Esta actualización ocurre gradualmente: una vez por solicitud pero no por segundo).
Kirill Bulygin
fuente