Re: Улучшение ngx_http_limit_req_module

Pavel V. pavel2000 на ngs.ru
Вт Фев 2 18:31:21 UTC 2016


Здравствуйте, Валентин.

>> Перевод в боевой режим может только уменьшить число запросов, поступающих на
>> учет нетестовые зоны, что является ожидаемым поведением в силу более жесткого
>> ограничения во включаемой зоне.
>> 
> [..]

> Да, и это влияние на учет запросов в других зонах может сказаться на
> поведении.

> Скажем вот в такой конфигурации:

>   location /one {
>       limit_req zone=soft; # rate=100r/s
>       limit_req zone=hard; # rate=1r/s
>   }

>   location /two {
>       limit_req zone=soft; # rate=100r/s
>   }

> Переключение limit_req zone=hard из режима dry-run в основной по вашей
> схеме может привести к тому, что в location /two начнет попадать существенно
> больше запросов.

> Этот эффект может быть нежелателен.

Такой эффект не зависит от схемы, может произойти и в случае, если в "location
/one" будет добавлена директива "limit_req_dry_run on;", и в случае, если
"limit_req zone=hard;" будет просто добавлена, без тестирования вовсе.

> Переключение .. может привести к тому, что в location /two начнет попадать
> существенно больше запросов.
> ... , а dry-run работающий в рамках  одной зоны его просто не покажет.

Эффект заключается в том, что ограничение в location /two сможет _пропускать_
существенно больше запросов. Однако возникает вопрос - откуда они возьмутся,
чтобы его смог показать какой-либо из режимов тестирования?

>> Цель добавления зоны test -  увидеть, какое количество запросов будет
>> задержано/отклонено, если мы уменьшим rate с 2r/s до 1r/s в зоне one.

> А вот и не получится увидеть.  1r/s в режиме dry-run может отклонить
> существенно меньше запросов, чем в обычном режиме.  Произойти это может
> из-за того, что часть запросов, которые могли бы попасть под ограничение
> в zone=test будут отклонены в зонах one и two.

Да, согласен - при наличии отклонений в зонах one и two количество увидеть не
получится. Часть запросов (по одинаковому ключу) в зоне test не будет учтена, т.к.
сработает ограничение зоны test, а часть не будет учтена, т.к. сработает
ограничение зоны one.

Чтобы подсчитать количество, необходимо добавлять в limit_req_zone параметр
warn_rate, в limit_req - warn_burst, а затем вести подсчеты превышений
ограничений по этим параметрам параллельно основным подсчетам. Такой вариант
когда-либо рассматривался?

Однако я исхожу из предположения, что мы имеем зону one, которая не ограничивает
никого лишнего, и хотим убедится, что изменение её настроек также никого лишнего
ограничивать не будет. Также предполагаем, что со второй зоной two тоже всё в
порядке и она также никого лишнего не ограничивает.

Для этих целей мы заводим зону test с таким же ключем, как и в зоне one.

Т.е. все манипуляции тестирования нацелены на детектирование факта отсутствия
предупреждений от тестовой зоны, в условиях отсутствия предупреждений от боевых
зон.

В этих условиях отсутствия (критически малого числа) отклонений запросов в зонах
one и two предлагаемый мной подход по оценке применимости настроек зоны test
вполне жизнеспособен и весьма актуален.


> Работа ограничений в зонах one и two изменится при выключении dry-run в
> зоне test.

По задумке, в боевой режим будут переводиться _параметры_, а не зона
test - т.е. по результатам теста будет производиться коррекция параметров зоны
one, а зона test будет удалена.


>> Я думаю, что вполне понятно то, что если в контексте есть ограничение с зоной
>> one с rate=2r/s, то добавление ограничения с тестовой зоной test с rate=3r/s не
>> покажет "количества ограничений", но это и не ожидается и не требуется.

> Зависит от критерия, по которому производится ограничение.

Предполагается, что у тестируемой и боевой зоны одинаковый критерий.


-- 
С уважением,
 Pavel                          mailto:pavel2000 at ngs.ru



Подробная информация о списке рассылки nginx-ru