Re: Реализация multiple limit_req
Maxim Dounin
mdounin на mdounin.ru
Пт Дек 16 17:04:31 UTC 2011
Hello!
On Fri, Dec 16, 2011 at 08:08:32PM +0400, Михаил Монашёв wrote:
[...]
> > Совсем без блокировок - не обойтись, т.к. там обход дерева в
> > разделяемой памяти, и потом ещё и обновление нескольких значений.
> > Без блокировок будет не просто неточно, а в лучшем случае - просто
> > мусор, в худшем - segmentation fault.
>
> Это говорит о том, что используемый алгоритм плохо подходит. Как
Нет, это лишь говорит о том, что без блокировок в этом месте не
обойтись.
> вариант его латания могу предложить сделать вместо одного дерева -
> тысячу деревьев. С однозначным отображением значения зоны в одно из
> деревьев. И блокировки соответственно ставить на каждое отдельное
> дерево, а не на весь лес. Тогда вероятность ожидания блокировки
> приблизится к нулю и их можно будет держать дольше, чем обычно.
>
> Число деревье фиксировано. Счётчик для каждого дерева находится в
> заранее известной ячейке памяти и потому менять его можно без
> блокировок.
Для того, чтобы бороться с lock contention, нужно сначала чтобы
там был оный lock contention. Тут под локом делается очень
небольшое количество операций, и шансов на lock contention,
особенно по сравнению с общей стоимостью запроса, практически
никаких.
> > p.s. Ты вот лучше кейсов накидай - как ты будешь использовать
> > несколько одновременных limit_req, когда они будут?
>
> Накидал бы уже давно, если б использовал limit_req. От ботов отбиваюсь
> почти-realtime анализом логов. Ну может использовал бы для борьбы со
> спам-ботами, когда они через прокси или из левых страны лезут. Ещё,
> было б интересно блокировать тех, кто ходит по одним локейшнам, а по
[...]
> Ещё сейчас в голову пришла мысль сделать модуль для борьбы с мусорным
> трафиком. Очень приближённо схема такая. Задаётся так же переменная,
[...]
Ну вот limit_req - это один из простых модулей для борьбы с DoS'ом и
всякими переборами паролей, расчитанный на то, чтобы работать "из
коробки" с минимальными затратами на конфигурирование.
Понятно, что "в идеале" нужна гораздо более сложная логика по
детектированию и предотвращению мусорного трафика, но это a) за
рамками задач этого модуля и б) в сложных случаях, боюсь, всё
равно не поможет, т.к. до nginx'а просто не дойдёт трафик.
Maxim Dounin
Подробная информация о списке рассылки nginx-ru