Jump to content
Калькуляторы

Ограничить скорость каждого TCP соединения

Здравствуйте, есть ли возможность на Linux средствами tc ограничить скорость TCP соедиения ?

Тоесть, что б например скорость соедиения не превышала 1 мегабит, но 2 соединения могли давать 2 мегабита.

Адреса источника и назначения должны быть любыми...

Share this post


Link to post
Share on other sites

Внесите задержку побольше, например 5000мс, тогда скорость сама по себе упадет.

 

За такие ответы надо расстреливать на месте

Share this post


Link to post
Share on other sites

Как идея, заставить iptables + bash-скрипты добавлять новое правило в tc при создании новой tcp сессии.

Интересно было б послушать, как "iptables+bash" будут реагировать на "создание новой tcp сессии".

Share this post


Link to post
Share on other sites

Например, iptables -j LOG и потом парсить этот лог в онлайн режиме башом или любым другим скриптом, выполняя нужные действия.

Share this post


Link to post
Share on other sites

А на микротике можно просто промаркировать все TCP соединения и ограничивать скорость по ним через PCQ, каждому соединению будет дана своя скорость, одинаковая для всех соединений.

Share this post


Link to post
Share on other sites

Например, iptables -j LOG и потом парсить этот лог в онлайн режиме башом или любым другим скриптом, выполняя нужные действия.

Значить файлы надо качать по 10 килобайт на соединение, муторно, зато быстро, ибо лаг то какой по отслеживанию... :)

Share this post


Link to post
Share on other sites

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

Скорость регулирует шейпер или полисер.

Share this post


Link to post
Share on other sites

http://www.linuxgazette.ru/rus/articles/taleLinuxTC.html

 

SFQ, Stochastic Fair Queuing

ESFQ, Extended Stochastic Fair Queuing

Что-то ограничения не радуют. Да и вообще похоже немного не то:

Обычная дисциплина SFQ становится неэффективной, если пользователи работают с программами, поддерживающими несколько потоков. В этом случае SFQ не способен поровну разделить канал между пользователями. Однако доступ к дополнительным параметрам алгоритма, обеспечиваемый дисциплиной обработки очереди ESFQ позволяет решить описанную проблему использованием другого хэша, например, по исходному адресу.

Несколько потоков vs по адресу? Хм.

Share this post


Link to post
Share on other sites

Насколько я понял, ESFQ поделит канал поровну, но не сможет ограничить именно скорость соединения.... К примеру если канал 100 мегабит, и 1 поток, то его скорость будет 100 мегабит.

Надо именно задать скорость

Share this post


Link to post
Share on other sites

Здравствуйте, есть ли возможность на Linux средствами tc ограничить скорость TCP соедиения ?

средствами tc, скорее всего нет. (если не создавать правила для всех возможных/разрешённых вариантов match правила с классами скоростей). Но это безумие.

Тут необходимо следить за создающимися/умирающими сессиями, и ограничивать их. Известных способов сделать это средствами tc, скорее всего нет. Если не крутить что то что будет реализовывать алгоритм вышеописанный.

Share this post


Link to post
Share on other sites

Способов нет скорее всего из-за безумной задачи. Что это вообще должно быть? Хост, гарантированно устанавливающий по одному соединению на "клиента" (кавычки тут от не представленных условий задачи)? Ну тогда, наверное можно дать каждому "клиенту" по серому IP, ограничить скорость по IP, а потом уже натить дальше. Сойдёт?

А если соединений произвольное количество, то что должно решать это ограничение скорости? Ведь пока не упрётся в полку, то от негарантированного количества соединений никакой "справедливости" не просматривается, а как упрётся - так и вообще ничего не надо, само сбалансируется.

Share this post


Link to post
Share on other sites

dev=imq0
tc qdisc del dev $dev root
tc qdisc add dev $dev handle 1025: root drr

for i in $(seq 1 1024); do
   h=$(printf %x $i)
   tc class add dev $dev parent 1025: classid 1025:$h drr
   tc qdisc add dev $dev parent 1025:$h handle $h: netem rate 1Mbit
done

tc filter add dev $dev protocol ip handle 1025 parent 1025: flow hash keys src,dst,proto,proto-src,proto-dst divisor 1024 perturb 10

Share this post


Link to post
Share on other sites

dev=imq0
tc qdisc del dev $dev root
tc qdisc add dev $dev handle 1025: root drr

for i in $(seq 1 1024); do
   h=$(printf %x $i)
   tc class add dev $dev parent 1025: classid 1025:$h drr
   tc qdisc add dev $dev parent 1025:$h handle $h: netem rate 1Mbit
done

tc filter add dev $dev protocol ip handle 1025 parent 1025: flow hash keys src,dst,proto,proto-src,proto-dst divisor 1024 perturb 10

 

 

Любопытно. Но верно ли я понимаю логику работы фильтра:

Имеем 1024 - класса, которые ограничивают сессии. (1024 по 1Мб)

Хешированием, по ключам (src,dst,proto,proto-src,proto-dst) раскидываем потоки/соеденения по этим калссам.

А если соеденений будет более 1024. Выходит кто то будет делить между собой скорость класса?

P.s. Я о написанном.

Edited by bomberman

Share this post


Link to post
Share on other sites

Любопытно. Но верно ли я понимаю логику работы фильтра:

Имеем 1024 - класса, которые ограничивают сессии. (1024 по 1Мб)

Хешированием, по ключам (src,dst,proto,proto-src,proto-dst) раскидываем потоки/соеденения по этим калссам.

А если соеденений будет более 1024. Выходит кто то будет делить между собой скорость класса?

P.s. Я о написанном.

 

Да.

Share this post


Link to post
Share on other sites

Как ни смешно, но только добавлением задержки можно формально решить эту задачу.

TCP создан для сетей с задержками, так что это не поможет. Гуглить tcp window scaling long fat networks

+ будут проблемы с интерактивными сессиями

 

dev=imq0

tc qdisc del dev $dev root

tc qdisc add dev $dev handle 1025: root drr

 

for i in $(seq 1 1024); do

h=$(printf %x $i)

tc class add dev $dev parent 1025: classid 1025:$h drr

tc qdisc add dev $dev parent 1025:$h handle $h: netem rate 1Mbit

done

 

tc filter add dev $dev protocol ip handle 1025 parent 1025: flow hash keys src,dst,proto,proto-src,proto-dst divisor 1024 perturb 10

Класс, а все как один говорили, что не возможно. Единственное, что туда будет попадать не только TCP, несколько я понимаю.

Share this post


Link to post
Share on other sites

Класс, а все как один говорили, что не возможно. Единственное, что туда будет попадать не только TCP, несколько я понимаю.

 

Можно же завернуть неTCP трафик фильтром с меньшим номером в класс без шейпера на нем...

 

А вместо drr можно, наверное, соорудить дерево из HFSC или HTB если нужно резать и суммарную полосу.

Share this post


Link to post
Share on other sites

Любопытно. Но верно ли я понимаю логику работы фильтра:

Имеем 1024 - класса, которые ограничивают сессии. (1024 по 1Мб)

Хешированием, по ключам (src,dst,proto,proto-src,proto-dst) раскидываем потоки/соеденения по этим калссам.

А если соеденений будет более 1024. Выходит кто то будет делить между собой скорость класса?

P.s. Я о написанном.

 

Да.

 

Выходит тоже кастыль, но более ровный. И универсального решения задачи не выполняет?

С учётом количества классов (если память не подводит max classid = 0xffff ) ~ 65535 то и потоков доложно быть не более в таком случае. А значит решение для максимум 65535 соеденений.

 

Но ведь можно строить деревья правил и классов.

В таком случае получаем - 0xffff:0xffff классов. что куда интереснее для решения задачи. Но меняется подход. Нужно определиться со скоростью на ip, если взять за основу, на ip 65535 соеденений и делить её между потоками. Думается мне, что так будет правильнее. (Или я в чём то ошибаюсь?)

 

P.s. вопрос автору, поста. Где и зачем это понадобилось? (любопытство) :-)

Edited by bomberman

Share this post


Link to post
Share on other sites

Как ни смешно, но только добавлением задержки можно формально решить эту задачу.

Далеко не всегда.

Зависит от СС и прочих настроек тцп на сервере и немного от клиентских.

Share this post


Link to post
Share on other sites

TCP создан для сетей с задержками, так что это не поможет. Гуглить tcp window scaling long fat networks

 

Погодь, разве мы обсуждали вопрос, как "бороться" с задержками? :) А эту борьбу мы проходили в конце 90-х, когда сидели на спутниковых каналах.

 

+ будут проблемы с интерактивными сессиями

 

Естественно будут. Но топикстартер и не просил шустрый интерактив. Он просил как-нибудь порезать скорость сессий.

 

Класс, а все как один говорили, что не возможно. Единственное, что туда будет попадать не только TCP, несколько я понимаю.

 

Ну это тоже подпорка. Причем, с не совсем понятной производительностью. Хотя, если она подойдет автору, значит это его решение.

 

Как ни смешно, но только добавлением задержки можно формально решить эту задачу.

Далеко не всегда.

Зависит от СС и прочих настроек тцп на сервере и немного от клиентских.

 

Т.е. автор будет решать задачу на сервере, а кто-то в это же время ему будет мешать ее решить, ломая настройки на его сервере? :) Ну а клиент, да, окошко может поменять.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.