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

Валентин Бартенев vbart на nginx.com
Вт Фев 2 16:48:11 UTC 2016


On Tuesday 02 February 2016 22:08:37 Pavel V. wrote:
> Здравствуйте, Валентин.
> 
> > Невозможно добавить или убрать ограничение, не повлияв на работу остальных.
> 
> В моей схеме можно добавить дополнительное тестовое ограничение, которое не
> сможет приводить к отклонению запроса, а значит не повлияет на подсчет запросов
> в остальных зонах.
> 
> >> В моей схеме можно добавить новую зону в тестовом режиме в дополнение к уже
> >> настроенным ограничениям. Не понимаю, как добавление новой тестовой зоны сможет
> >> повлиять на уже настроенные ограничения.
> 
> > Если директива приводит к отклонению запроса, то он не будет учтен во всех
> > зонах. Если мы сделаем режим таким, что при этом запрос будет учтен, но не
> > будет отклонен, то это не даст нам возможности оценить работу директивы,
> > поскольку всё будет работать несколько не так, как если бы dry-run был выключен
> > и не позволит оценить реальное влияние директивы на количество пропущенных
> > запросов.
> 
> Тестовое ограничение не может приводить к отклонению запроса, значит запрос
> может быть отклонен только другой, не тестовой директивой.
> 
> Если  состояние тестируемой зоны показывает необходимость отклонения
> запроса этой зоной, то запрос в этой тестовой зоне не учитывается независимо от
> того, будет ли отклонен запрос другими зонами или нет. В остальных зонах запрос
> учитывается согласно окончательному решению по отклонению или пропуску запроса,
> на которое тестируемая зона не влияет.
> 
> Если другие, не тестовые директивы, не отклоняют запросы, то их подсчет в
> тестовой зоне ведется и будет соответствовать реальной картине потока запросов.
> 
> Если другие, не тестовые директивы, отклоняют запросы, а тестовая зона не
> отклоняет - значит тестируемая зона имеет менее жесткие ограничения, что
> является для нас метрикой допустимости перевода её в боевой режим.
> 
> Перевод в боевой режим может только уменьшить число запросов, поступающих на
> учет нетестовые зоны, что является ожидаемым поведением в силу более жесткого
> ограничения во включаемой зоне.
> 
[..]

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

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

  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 объединены ограничения по различным факторам, спрогнозировать
может быть трудно, а dry-run работающий в рамках одной зоны его просто
не покажет.


> > Если мы будем действовать также, как без режима dry-run, но только пропускать
> > запрос, то это повлияет на работу сервера парадоксальным образом - более
> > жесткое ограничение в режиме dry-run будет приводить к пропусканию сервером
> > большего количества запросов, чем при его отсутствии.
> 
> Другие, не тестовые директивы, могут отклонить запрос.
> 
> Я вижу применение например следующим:
> 
> limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;  #perip
> limit_req_zone $server_name zone=two:10m rate=10r/s;        #perserver
> 
> limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s dry-run;  #test zone
> 
> location / {
>       limit_req zone=test; # rate = 1 r/s, dry run
>       limit_req zone=one;  # rate = 2 r/s
>       limit_req zone=two;  # rate = 100 r/s
> }
> 
> Цель добавления зоны test -  увидеть, какое количество запросов будет
> задержано/отклонено, если мы уменьшим rate с 2r/s до 1r/s в зоне one.
> 

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

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


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

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

--
Валентин Бартенев


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