LINUX.ORG.RU
ФорумAdmin

tc, ограничение скорости


0

0

Дайте plz готовый скрипт, который бы просто ограничивал скорость в N кбайт/с на таком-то интерфейсе. Без приоритетов, без распределения по адресам и т.д.

anonymous

Ответ на: комментарий от Steel901

Поздно. :)

Если кому понадобится:

#!/bin/sh lan=eth0

tc=`which tc` $tc qdisc del dev eth0 root

$tc qdisc add dev $lan root handle 1: htb $tc class add dev $lan parent 1: classid 1:6 htb rate 1024kbit ceil 2048kbit $tc filter add dev $lan protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.0/24 flowid 1:6

На что влияет ceil я так и не понял, выше установленного в rate прыгнуть не получилось никак...

anonymous
()
Ответ на: комментарий от anonymous

Злое факин форматирование...

#!/bin/sh

lan=eth0

tc=`which tc`

$tc qdisc del dev eth0 root

$tc qdisc add dev $lan root handle 1: htb

$tc class add dev $lan parent 1: classid 1:6 htb rate 1024kbit ceil 2048kbit

$tc filter add dev $lan protocol ip parent 1: prio 1 u32 match ip dst 192.168.0.0/24 flowid 1:6

anonymous
()
Ответ на: комментарий от anonymous

> На что влияет ceil я так и не понял, выше установленного в rate прыгнуть не получилось никак...

rate - минимально гарантированная скорость;
ceil - максимально возможная

Немного не понял смысла всех этих твоих движений... Если нужно просто жёстко ограничить скорость, то можно посмотреть в сторону других более приспособленных для этого дисциплин:

#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps


Если же нужно зарезервировать канал для сети 192.168.0.0/24 (при этом есть ещё сети), то нужно поменять правила htb, ибо в таком виде, как сейчас при нагруженном канале только 1024kbit и будет.

В данном примере сеть 192.168.0.0/24 имеет приоритет перед остальными адресами. Причём приоритет практически полный:

#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan root handle 1: htb default 3

$tc class add dev $lan parent 1: classid 1:1 htb rate 2048kbit

$tc class add dev $lan parent 1:1 classid 1:2 htb rate 2024kbit ceil 2048kbit prio 1

$tc class add dev $lan parent 1:1 classid 1:3 htb rate 24kbit ceil 2048kbit prio 2

$tc filter add dev $lan protocol ip parent 1: u32 match ip dst 192.168.0.0/24 flowid 1:2


P.S. только не забывай, что максимальная скорость, используемая в tc, должна быть немного меньше реальной пропускной способности канала. Иногда с этим "немного меньше" приходится ограничивать макс.скорость до 70% от реальной.

Ссылки по теме:
http://www.linux.com/base/ldp/howto/Traffic-Control-HOWTO/index.htmlt
http://www.linuxdocs.org/HOWTOs/Adv-Routing-HOWTO.html#toc15
http://www.topology.org/linux/tc.html

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps

И всё, одна строчка, без filter и class?

> В данном примере сеть 192.168.0.0/24 имеет приоритет перед остальными адресами. Причём приоритет практически полный:

Спасибо, разбираюсь...

> Ссылки по теме:

Нашёл на русском: http://www.opennet.ru/base/net/linux_traffic_qos.txt.html

С классами этими и дисциплинами мозг вывихнуть можно... Всё равно спасибо за советы :)

anonymous
()
Ответ на: комментарий от anonymous

>> tc qdisc add dev $lan handle 1:0 root tbf burst 20k limit 20k mtu 1514 rate 2048kbps
>И всё, одна строчка, без filter и class?


И всё. TBF - это безклассовая дисциплина. То есть конечная, или, краевая дисциплина. Поэтому больше ничего и не нужно прописывать.

> С классами этими и дисциплинами мозг вывихнуть можно...

Ну... дисциплина - это фактически название алгоритма "нарезки" канала.
Класс - это правило "нарезки" внутри алгоритма.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> И всё. TBF - это безклассовая дисциплина. То есть конечная, или, краевая дисциплина. Поэтому больше ничего и не нужно прописывать.

Понял.

> Ну... дисциплина - это фактически название алгоритма "нарезки" канала. Класс - это правило "нарезки" внутри алгоритма.

Чёрт, так просто... Спасибо ещё раз. :)

anonymous
()
Ответ на: комментарий от Sylvia

Гуй я не встречал.

Для упрощения лепил своё... перловое и негуёвое :). Конфиг в XML, на выходе даёт готовый к запуску bash-скрипт. Похоже на tcng. Велосипед сделал, но свой велосипед, какой мне надо. :)
Кому интересно - выложу где-нить...

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

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


локальные порты 2106 7777 8085 - максимальный приоритет
для того что на них висит

LAN 192.168.1.0/24
с низким приоритетом, без ограничения скорости

подсети провайдера, несколько разных блоков 91.122 89.110 92.100 и чего-то там еще - наименьший приоритет, ограничение на upstream

исходящие на last.fm (87.117.0.0/16) - максимальный приоритет
исходящие на порт 22 - тоже максимально

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

Sylvia ★★★★★
()
Ответ на: комментарий от Sylvia

Это на файрволле будет настраиваться? Сколько сетевых на нём?

Сейчас подготовлю архив и куда-нить выложу...

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

ftp://cis.by/pub/gnutc/gnutc-0.1.tar.gz

Коротко:

./bin/ - исполняемые файлы
ethloop - генератор трафика
gnutc-cgi - формирует страничку с графиками.
gnutc-make-diagram
gnutc-parce-config
gnutc-prepare-test
gnutc-show-trafic-table
Из названий примерно понятно для его оно всё... :)

./cfgs/ - конфиги
main.conf - общий конфиг (пути и т.д.); tc.conf - основной конфиг для tc. Там заданы общие для всех переменные. tc-<dev>.conf - конфиги для каждого интерфейса.

./cgi-bin/
gnutc-cgi - формирует страничку с графиками. дублирует gnutc-cgi из bin. Руки не дошли в порядок привести :)

./contrib/
htb_ethloop_ex.tgz - исходники генератора трафика

./doc/
readme.txt - мнэ... "хочешь сильно наказать программера - посади его описывать свои поделки..." Про меня :)

./img/
В этом каталоге создаются графики по результатам тестов.

./out/
Сюда валятся все файлы, которые создаются. По идее временный каталог.

./tests/
Набор правил для формирования тестового трафика

./.htaccess
Если обратиться браузером к нашему каталогу, то отображаем страницу с результатами тестов.

./start.sh
Непосредственно для запуска всего этого добра

./tests.sh
Для запуска тестов.

У меня оно всё лежит в каталоге /var/www/html/gnutc (ЦГИшка в /var/www/cgi-bin). Набираю в браузере http://127.0.0.1/gnutc и вижу результаты тестов. На роутере оно в другом месте, соответственно. запускается только start.sh Оно всё пока не приведено в божеский вид, но если "пойдёт в массы" - сделаю нормально, а не "достаточно для меня".

Пока всё. По созданию XML-конфига под конкретные нужды обращайтесь - либо расскажу, либо пофиксю :)


Slavaz ★★★★★
()
Ответ на: комментарий от Sylvia

> локальные порты 2106 7777 8085 - максимальный приоритет для того что на них висит
Это доступ к самому роутеру? Трафик к нему и так выделится в отдельный канал.

Ну представим, что:
- ширина канала у тебя из инета 2048к
- сетевуха eth0 - это сетевуха в локалку. 
- ширина канала в инет 1024к
- сетевуха к модему: eth1
- адрес роутера, на котором всё это пускается: 192.168.1.254
- провайдер жёстко ограничил скорости  на всё(у меня в инет жёстко ограничено, а на внутренние ресурсы провайдера - на максимально возможной для ADSL).

Тогда:
cfgs/tc.conf:

$PERCENT_DOWN=16%
$eth0_ADSL_RATE=2048kbit
$eth1_ADSL_RATE=1024kbit

$PROVIDER_IP=192.168.91.122, 192.168.89.110, 192.168.92.100 
$LAN_NETWORK=192.168.1.0/24

Include tc-eth0.conf
Include tc-eth1.conf

cfgs/tc-eth0.conf:
<DEVICE>
    name=eth0
    lan_interface=true
    description="Сетевая карта в LAN"
    queue_length=30
    mtu=1500
    <CHANNEL>
        name=ROOT
        description="корневая дисциплина"
        default=OTHER

        <CHANNEL>
            name=LAN
            description="Канал 'жирных' хостов"
            rate=80mbit
            <filter>
                    ip = 192.168.1.254
            </filter>

        </CHANNEL>

        <CHANNEL>
                name=INTERNET
                description="Интернет-трафик"
                rate=$eth0_INET_RATE

                <CHANNEL>
                    name=SUPERCHANNEL
                    description="Рабочий канал с высоким приоритетом"
                    rate=($eth0_INET_RATE/2)
                    ceil=$eth0_INET_RATE
                    prio=1
                    # маленькие пакеты и приоритетные порты и last.fm
                    <filter>
                        size = :100
                        port = tcp:22, 53
                        src_ip = 87.117.0.0/16
                    </filter>
                </CHANNEL>
                 <CHANNEL>
                    name=LAN_NETWORK
                    description="Канал локальной сети"
                    rate=$eth0_INET_RATE/4
                    ceil=$eth0_INET_RATE
                    prio=2
                    <filter>
                        dst_ip = $LAN_NETWORK
                    </filter>
                    <CHANNEL>
                        name=LAN_NETWORK_esfq
                        description="Справедливая раздача канала"
                        qdisc=true
                        type=esfq
                        params=perturb 10 hash dst
                    </CHANNEL>
                </CHANNEL>
                <CHANNEL>
                    name=OTHER
                    description="Канал остальных"
                    rate=$eth0_INET_RATE/4
                    ceil=$eth0_INET_RATE
                    prio=3
                    <CHANNEL>
                        name=OTHER_esfq
                        description="Справедливая раздача канала"
                        qdisc=true
                        type=esfq
                        params=perturb 10 hash dst
                    </CHANNEL>
                </CHANNEL>
                <CHANNEL>
                    name=PROVIDER
                    description="Канал от хостов провайдера"
                    rate=0
                    ceil=$eth0_INET_RATE
                    prio=4
                    <filter>
                        src_ip = $PROVIDER_IP
                    </filter>
                    <CHANNEL>
                        name=OTHER_esfq
                        description="Справедливая раздача канала"
                        qdisc=true
                        type=esfq
                        # трафик поровну между хостами провайдера
                        params=perturb 10 hash dst
                        # трафик поровну между "качателями"
                        # params=perturb 10 hash src
                    </CHANNEL>
                </CHANNEL>
    </CHANNEL>
</DEVICE>

cfgs/tc-eth1.conf:
По аналогии с cfgs/tc-eth0.conf. Лениво расписывать.

Примерно так. Если что не понял - уточни.

P.S. Вместо esfq можно использовать и sfq (если нету esfq), но sfq делит поровну между потоками, а esfq - между хостами. Разница в том, что кто-то один может качать в *надцать потоков и перебьёт всем канал.

Slavaz ★★★★★
()

htb.init

достаточно удобно вроде

roller ★★★
()
Ответ на: комментарий от Slavaz

> Если нужно просто жёстко ограничить скорость, то можно посмотреть в сторону других более приспособленных для этого дисциплин:

А если надо жёстко ограничить скорость по диапазонам адресов, а не по сетевухам?

anonymous
()
Ответ на: комментарий от Slavaz

сетевая одна, но попробую разобраться
спасибо большое

Sylvia ★★★★★
()
Ответ на: комментарий от anonymous

#!/bin/sh
lan=eth0
tc=`which tc`
$tc qdisc del dev $lan root
$tc qdisc add dev $lan root handle 1: htb default 1

$tc class add dev $lan parent 1: classid 1:1 htb rate 80mbit

$tc class add dev $lan parent 1:1 classid 1:2 htb rate 1kbit

tc filter add dev $lan parent 1:0 protocol ip handle 1 fw flowid 1:2

iptables -t mangle -A POSTROUTING -o $lan -m iprange --src-range 192.168.0.20-192.168.0.30 -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -o $lan -m iprange --src-range 192.168.0.20-192.168.0.30 -j RETURN


Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

О, у меня вопросы!

Вот этот момент не понял:

> $tc class add dev $lan parent 1:1 classid 1:2 htb rate 1kbit

Почему не "parent 1:" ?

Вот тут тоже, где именно здесь проверяется MARK 1:

> tc filter add dev $lan parent 1:0 protocol ip handle 1 fw flowid 1:2

И ещё почему конструкция с iptables, а не через u32 match src и тому подобное?

anonymous
()
Ответ на: комментарий от anonymous

>> $tc class add dev $lan parent 1:1 classid 1:2 htb rate 1kbit

> Почему не "parent 1:" ?


Можно и parent 1:0. Но рекомендовано к дисциплине присоединять один класс, а потом уже из его потомков растить дерево. Два класса к дисциплине присоединяются, если уж очень разные трафики... например, трафик к локальной машине и к провайдеру. Если же логически один канал и просто нужно сделать "доброе дело" отдельным товарищам(как в нашем примере), то желательно в одном канале.

>Вот тут тоже, где именно здесь проверяется MARK 1:

>> tc filter add dev $lan parent 1:0 protocol ip handle 1 fw flowid 1:2


А тут почему 1:0? Потому что все фильтры привязываются только к корневой дисциплине. Это жёсткое правило, иначе не сработают.

> И ещё почему конструкция с iptables, а не через u32 match src и тому подобное?


Ну... можно и через u32, но я использую iptables для унификации. Например, при классическом "СЕТЬ<->РОУТЕР<->МОДЕМ" сетевой адрес в модем обычно SNATится, u32 при SNATе не срабатывает - только iptables.
Либо захочешь приоритеты по пользователям или программам настраивать - просто tc filter не спасает.


Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> Ну... можно и через u32, но я использую iptables для унификации.

Так где там происходит проверка на MARK 1, не понимаю... Может опечатался?

anonymous
()
Ответ на: комментарий от Slavaz

> После handle единица. Это и есть MARK

То есть в более последовательном виде это было бы "fw handle 1", типа критерий, параметр и его значение?

anonymous
()
Ответ на: комментарий от sdio

Есть еще snitch
== Intro ==

Snitch is a tool for creating tc (traffic control) commands to
configure the built-in packetshaping utilities of Linux. It was
written in conjunction with another project, l7-filter, which consists
of a kernel patch to allow shaping on application-level protocols.
l7-filter can be found at http://sourceforge.net/projects/l7-filter.


Сразу не собрался, надо посмотреть чего там плюсам нехватает

snitch-0.0.1$ make
g++ -Wall -o snitch snitch.cpp
snitch.cpp: In function ‘void GetBandwidthInfo(int&, int&, std::string&, std::string&, std::string&, std::string&, std::ifstream&, int&)’:
snitch.cpp:190: error: ‘strlen’ was not declared in this scope

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.