Давайте этот конфиг:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 127.0.0.1:81;
location/{
limit_req zone=one burst=5;
echo 'OK';
}
location /nodelay {
limit_req zone=one burst=5 nodelay;
echo 'OK';
}
}
и проверить его с NODELAY
$ siege -q -b -r 1 -c 10 http://127.0.0.1:81/nodelay
done.
Transactions: 6 hits
Availability: 60.00 %
Elapsed time: 0.01 secs
Data transferred: 0.00 MB
Response time: 0.00 secs
Transaction rate: 600.00 trans/sec
Throughput: 0.09 MB/sec
Concurrency: 0.00
Successful transactions: 6
Failed transactions: 4
Longest transaction: 0.00
Shortest transaction: 0.00
и без NODELAY
$ siege -q -b -r 1 -c 10 http://127.0.0.1:81/
done.
Transactions: 6 hits
Availability: 60.00 %
Elapsed time: 5.00 secs
Data transferred: 0.00 MB
Response time: 2.50 secs
Transaction rate: 1.20 trans/sec
Throughput: 0.00 MB/sec
Concurrency: 3.00
Successful transactions: 6
Failed transactions: 4
Longest transaction: 5.00
Shortest transaction: 0.00
Они оба прошло 6 запроса, покупку с nodelay
процессом Nginx всех разрывного запросов мгновенно и без этой опции Nginx делает чрезмерные запросы ждать так, что общая ставка будет не более 1 запроса в секунду и последний успешный запрос потребовалось 5 секунд.
EDIT: rate=6r/s
Фактически означает один запрос в 1/6 секунды. Так что если вы отправляете запрос 6 одновременно вы получите 5 из них с 503.
Существует хороший ответ с «ведром» объяснение https://serverfault.com/a/247302/211028
Посмотрите время последнего успешного запроса. –
не могли бы вы объяснить это вкратце. –