Перейти к содержимому
Калькуляторы

[tc][htb] два варианта реализации, но ни одного корректно работающего

пришёл ответ от Мартина:

only leaves has quantum & prios..
коротко и ясно...
Изменено пользователем cac2s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем салют.

 

Сразу скажу что это единственное свежее и "понятное" обсуждение темы по шейпингу с помощью "tc" и "iptables" что удалось найти в гугле за сутки поисков. Спасибо автору за детальное описание используемой схемы. Сам сейчас занимаюсь переписыванием шейпера на основе tc+iptables, ибо текущая конфигурация не справляется с нагрузкой (в пиках ~700+ Mbit/сек и 100k пакетов/сек и порядка 20к+ IP-адресов, благо большая часть суммаризована в /27 сетки).

 

На счет проблемы с приоритетами, вижу, разобрались :) В каком-то доке по "tc" в начале говорится, что поддерживаются приоритеты 0-7 (0 - самый высокий).

 

Еще, что сразу бросилось в глаза, не вникая в детали конфигурации - это привязка "tc filter" не к root'ому qdisc'у в случае использования HTB:

 

Also, with HTB, you should attach all filters to the root!
© http://lartc.org/howto/lartc.qdisc.filters.html

 

Если я что не дочитал и не так понял - исправте меня :)

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще, что сразу бросилось в глаза, не вникая в детали конфигурации - это привязка "tc filter" не к root'ому qdisc'у в случае использования HTB:

 

Also, with HTB, you should attach all filters to the root!
© http://lartc.org/howto/lartc.qdisc.filters.html

 

Если я что не дочитал и не так понял - исправте меня :)

исправляю: я при классификации пакетов при помощи iptables вместо -j MARK использую -j CLASSIFY, так что необходимость в добавлении фильтров к корневой дисциплине отпадает (см. здесь)

 

а те фильтры, о которых Вы говорите - это гарантия деления ширины между dst, а не src,dst,proto,proto-src,proto-dst (по умолчанию), т.е. каждая краевая дисциплина теперь будет делить свою полосу между ip

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2cac2s: Ну так как успехи-то? Вроде бы все вопросы разобраны - должно работать, не?

 

На сколько я понимаю реплику в LARTC про фильтры, речь про рут, идет в том случае, когда классифицировать пакет надо в другой лиф, нежели вешается фильтр. Мол, тогда работать не будет. Потому что я когда последний раз его читал, а это было лет 5 назад, то там такого не было и фильтры спокойно вешались на лифы, если фильтр классифицирует четко только в этот класс. Я и сейчас их туда вешаю и всё работает как надо, правда не с последними ядрами, но всеравно. Разве что-то изменилось, может кто-то объяснить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2cac2s: Ну так как успехи-то? Вроде бы все вопросы разобраны - должно работать, не?

выходные же! =) завтра приду на работу, и первым делом переделаю схему с учётом прежних ошибок, оттестирую и отпишу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2cac2s: Ну так как успехи-то?
и так, схема:

+------+
| root |
+------+
|
|  +---------------------------------+
+--| class 1:1 (нетранзитный трафик) |
|  +---------------------------------+
|
|  +---------------------------------+
+--| class 1:5 (транзитный трафик)   |
   +---------------------------------+
     |  +------+
     |--| 1:10 | rate 5%  ceil 25% (icmp, dns)
     |  +------+
     |  +------+
     |--| 1:20 | rate 10% ceil 50% (icecast)
     |  +------+
     |  +------+
     |--| 1:30 | rate 10% ceil 50% (ssh, rdp)
     |  +------+
     |  +------+
     |--| 1:40 | rate 10% ceil 30% (mail)
     |  +------+
     |  +------+
     |--| 1:50 | rate 40% ceil 100% (web)
     |  +------+
     |  +------+
     |--| 1:60 | rate 20% ceil 90%
     |  +------+
     |  +------+
     +--| 1:90 | rate 5%  ceil 75% (bulk)
        +------+

скрипт:

#!/bin/bash

IPT="/sbin/iptables"
TC="/sbin/tc"
IP="/bin/ip"

DEV_IN="eth0"  # Смотрит в лок. сеть
RATE_IN="2500" # Гарантированная 3072КБит

RATE_LOCAL="1gbit"
IP_LOCAL="192.168.0.254"

$TC qdisc del dev $DEV_IN root >/dev/null 2>&1
$IP link set dev $DEV_IN qlen 32
$TC qdisc add dev $DEV_IN root handle 1: htb

# Нетранзитный трафик
$TC class add dev $DEV_IN parent 1: classid 1:1 htb rate $RATE_LOCAL quantum 60000 prio 7
$TC qdisc add dev $DEV_IN parent 1:1 pfifo

$TC filter add dev $DEV_IN parent 1: prio 1 protocol ip u32 match ip src $IP_LOCAL flowid 1:1

# Транзитный трафик
$TC class add dev $DEV_IN parent 1: classid 1:5 htb rate ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:5 classid 1:10 htb rate $[5[quot]$RATE_IN/100]kbit  ceil $[25[/quot]$RATE_IN/100]kbit prio 0
$TC class add dev $DEV_IN parent 1:5 classid 1:20 htb rate $[10[quot]$RATE_IN/100]kbit ceil $[50[/quot]$RATE_IN/100]kbit prio 1
$TC class add dev $DEV_IN parent 1:5 classid 1:30 htb rate $[10[quot]$RATE_IN/100]kbit ceil $[50[/quot]$RATE_IN/100]kbit prio 2
$TC class add dev $DEV_IN parent 1:5 classid 1:40 htb rate $[10[quot]$RATE_IN/100]kbit ceil $[30[/quot]$RATE_IN/100]kbit prio 3
$TC class add dev $DEV_IN parent 1:5 classid 1:50 htb rate $[40[quot]$RATE_IN/100]kbit ceil ${RATE_IN}kbit         prio 4
$TC class add dev $DEV_IN parent 1:5 classid 1:60 htb rate $[20[/quot]$RATE_IN/100]kbit ceil $[90[quot]$RATE_IN/100]kbit prio 5
$TC class add dev $DEV_IN parent 1:5 classid 1:90 htb rate $[5[/quot]$RATE_IN/100]kbit  ceil $[75[quot]$RATE_IN/100]kbit prio 6

$TC qdisc add dev $DEV_IN parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:50 handle 50: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:60 handle 60: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:90 handle 90: sfq perturb 10

    $TC filter add dev $DEV_IN parent 10: protocol ip handle 110 flow hash keys dst divisor 512
    $TC filter add dev $DEV_IN parent 20: protocol ip handle 120 flow hash keys dst divisor 512
    $TC filter add dev $DEV_IN parent 30: protocol ip handle 130 flow hash keys dst divisor 512
    $TC filter add dev $DEV_IN parent 40: protocol ip handle 140 flow hash keys dst divisor 512
    $TC filter add dev $DEV_IN parent 50: protocol ip handle 150 flow hash keys dst divisor 512
    $TC filter add dev $DEV_IN parent 60: protocol ip handle 160 flow hash keys dst divisor 512
    $TC filter add dev $DEV_IN parent 90: protocol ip handle 190 flow hash keys dst divisor 512

$IPT -t mangle -D POSTROUTING -o $DEV_IN -j SHAPER-IN >/dev/null 2>&1
$IPT -t mangle -F SHAPER-IN >/dev/null 2>&1
$IPT -t mangle -X SHAPER-IN >/dev/null 2>&1

$IPT -t mangle -N SHAPER-IN
$IPT -t mangle -I POSTROUTING -o $DEV_IN -j SHAPER-IN

# icmp, dns
$IPT -t mangle -A SHAPER-IN -p icmp -j CLASSIFY --set-class 1:10
$IPT -t mangle -A SHAPER-IN -p udp --sport 53 -j CLASSIFY --set-class 1:10

# icecast
$IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 7000,8000 -j CLASSIFY --set-class 1:20

# ssh, rdp
$IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 22,3389 -j CLASSIFY --set-class 1:30

# imap, imaps, pop3, pop3s
$IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 143,993,110,995 -j CLASSIFY --set-class 1:40

# http, https; ftp(20,21)
$IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 80,8080,443,20,21,1935 -j CLASSIFY --set-class 1:50

# bulk
$IPT -t mangle -A SHAPER-IN -j CLASSIFY --set-class 1:90

echo "Inbound shaping added to $DEV_IN.   Rate: ${RATE_IN}Kbit/sec."

результат неизменный :-/

при старте торрент-закачки bulk-класс ни как не хочет отдавать "одолженную" ширину. сцу..а :)

Изменено пользователем cac2s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще раз говорю: попробуйте для начала на контролируемых передачах данных, аля просто закачки и с простой конфигурацией, аля 2 класса. Потом начинайте усложнять конфигурацию. В данной ситуации всё закономерно: торрент перетянул одеяло, и tcp закачка разогнаться не может, потому что окно мелкое, то есть свои 100% цейла оно забрать не может. Зато торрент свои 75% как занефиг.

 

Потестить на простой конфигурации надо, чтобы понять вообще, идет ли шейпинг, приоретизация нормально, или нет, на ваших полосах. Квантумы помельче поставьте, бурсты уберите для низкоприоритетного класса.

Изменено пользователем Dark_Angel

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще раз говорю: попробуйте для начала на контролируемых передачах данных, аля просто закачки и с простой конфигурацией, аля 2 класса.
так пробовал уже

ладно. для пущей уверенности сделаю ещё раз:

#!/bin/bash

IPT="/sbin/iptables"
TC="/sbin/tc"
IP="/bin/ip"

DEV_IN="eth0"  # Смотрит в лок. сеть
RATE_IN="2500" # Гарантированная 3072КБит

$TC qdisc del dev $DEV_IN root >/dev/null 2>&1
$IP link set dev $DEV_IN qlen 32
$TC qdisc add dev $DEV_IN root handle 1: htb

# Транзитный трафик
$TC class add dev $DEV_IN parent 1: classid 1:5 htb rate ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:5 classid 1:10 htb rate $[75[quot]$RATE_IN/100]kbit ceil ${RATE_IN}kbit prio 0    # 75%
$TC class add dev $DEV_IN parent 1:5 classid 1:20 htb rate $[25[/quot]$RATE_IN/100]kbit ceil ${RATE_IN}kbit prio 1    # 25%

$TC qdisc add dev $DEV_IN parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:20 handle 20: sfq perturb 10

$IPT -t mangle -D POSTROUTING -o $DEV_IN -j SHAPER-IN >/dev/null 2>&1
$IPT -t mangle -F SHAPER-IN >/dev/null 2>&1
$IPT -t mangle -X SHAPER-IN >/dev/null 2>&1

$IPT -t mangle -N SHAPER-IN
$IPT -t mangle -I POSTROUTING -o $DEV_IN -j SHAPER-IN

$IPT -t mangle -A SHAPER-IN -d 192.168.0.100 -j CLASSIFY --set-class 1:10
$IPT -t mangle -A SHAPER-IN -d 192.168.0.100 -j RETURN

$IPT -t mangle -A SHAPER-IN -d 192.168.0.248 -j CLASSIFY --set-class 1:20
$IPT -t mangle -A SHAPER-IN -d 192.168.0.248 -j RETURN

echo "Inbound shaping added to $DEV_IN.   Rate: ${RATE_IN}Kbit/sec."

проверка показывает правильную работу: 100-й ip одной закачкой/соединением "ест" 75%, 248-й ip тремя закачками - 25%

Изменено пользователем cac2s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отлично, а теперь засуньте в 1:20 торрент. Не меняйте ничего, просто начните с того ИП качать торрнетом.

Изменено пользователем Dark_Angel

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Отлично, а теперь засуньте в 1:20 торрент. Не меняйте ничего, просто начните с того ИП качать торрнетом.
дык, а что после этого? поставить что-то качать - не проблема. докачаться ведь может :)

UPD: запустил торрент-качалку

Изменено пользователем cac2s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если распределение полос будет нормальным, значит в конфигурации с мудреными фильтрами что-то плывет.

 

Я же думаю, что торрент отберет свой цейл, т.е. почти всю полосу, вместо 25%.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я же думаю, что торрент отберет свой цейл, т.е. почти всю полосу, вместо 25%.

да. так оно и случилось. блин...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну вот теперь на этой простой конфигурации и откатайте то решение которое хотите внедрить. Попробуйте схему 2+1 о которой я писал выше. Клиенты займут для сайтов чуть больше полосы, но зато тормозить оно у них не будет и если начнется кач с обоих источников, торрента и веба( маловероятно ), то клиенты не заберут больше 3х Мбит. В основном же они будут сидеть в своих 2х Мбитах. Решение - не фонтан, но тем не менее.

 

Попробуйте еще покрутить quantum, и убрать любые бурсты классу с торрентом и cburst корневому классу. Может отдаст хотябы какой-то процент своего класса. Целиком загнать его в рейт можно будет только множественными потоками в http классе, которые будут вести себя так же по-хамски как и он сам.

Изменено пользователем Dark_Angel

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну вот теперь на этой простой конфигурации и откатайте то решение которое хотите внедрить. Попробуйте схему 2+1 о которой я писал выше. Клиенты займут для сайтов чуть больше полосы, но зато тормозить оно у них не будет и если начнется кач с обоих источников, торрента и веба( маловероятно ), то клиенты не заберут больше 3х Мбит. В основном же они будут сидеть в своих 2х Мбитах.
прошу прощения, но голова уже квадратная. можно подробнее?

 

например, есть 1:10 prio 4 для веба и 1:20 prio 7 для торрентов. куда лепить 3-й класс, и какие давать rate и ceil всем трём (можно в процентах. думаю, смысл будет уловлен)

Изменено пользователем cac2s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как вариант, можно давать клиенту полосу шире, чем пакет. Скажем у него 2Мбита, вы даете 2+1. Скажем 2 отдаете на торрент, а 2 отдаете на веб, при этом 1 Мбит будет гуляющим то в один, то в другой класс. Одновременно занять 3 Мбита пользователь не сможет, потому что торрент.

То есть есть, скажем 3 класса:

1:2 rate 2Mbit ceil 3Mbit

 

И два лифа:

1:10 rate 1Mbit ceil 2Mbit

1:20 rate 1Mbit ceil 2Mbit

 

Кстати попробуйте еще в вашей текущей схеме дать rate 1Kbit для класса с торрентом. У него тогда корзина должна быть мелкой и при мелком кванте он может не продавить http.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То есть есть, скажем 3 класса:

1:2 rate 2Mbit ceil 3Mbit

1:10 rate 1Mbit ceil 2Mbit

1:20 rate 1Mbit ceil 2Mbit

 

Кстати попробуйте еще в вашей текущей схеме дать rate 1Kbit для класса с торрентом. У него тогда корзина должна быть мелкой и при мелком кванте он может не продавить http.

уррррааааа! дядя Фёдорррр пррриеееехааал!!! it's works!

 

в общем:

1:2 rate 85% ceil 100%

1:10 rate 85% ceil 85%

1:20 rate 1kbit ceil 85%

при такой схеме всё намного! лучше.

 

дальше. применяю такой подход к боевой схеме:

+------+
| root |
+------+
|
|  +---------------------------------+
+--| class 1:1 (нетранзитный трафик) |
|  +---------------------------------+
|
|  +---------------------------------+
+--| class 1:5 (транзитный трафик)   | rate 85%  ceil 100%
   +---------------------------------+
     |  +------+
     |--| 1:10 | rate 5%  ceil 85% (icmp, dns)
     |  +------+
     |  +------+
     |--| 1:20 | rate 15% ceil 85% (icecast)
     |  +------+
     |  +------+
     |--| 1:30 | rate 10% ceil 85% (ssh, rdp)
     |  +------+
     |  +------+
     |--| 1:40 | rate 20% ceil 85% (http<512Кбит)
     |  +------+
     |  +------+
     |--| 1:50 | rate 25% ceil 85% (mail, jabber, http>512Кбит )
     |  +------+
     |  +------+
     +--| 1:90 | rate 1kbit  ceil 85% (bulk)
        +------+

итог - при неоходимости 1:90 скукоживается до нескольких килобит

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну если гарантировать какую-то полосу 1:90 не надо, то задача решена. Можете даже не стесняться и дать классу 100% цейла, а то из-за 15% недостающих могут начать возбуждаться клиенты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну если гарантировать какую-то полосу 1:90 не надо, то задача решена. Можете даже не стесняться и дать классу 100% цейла, а то из-за 15% недостающих могут начать возбуждаться клиенты.
нет. не нужно. достаточно того, что он может разгонятся.

спасибо Вам большое!

 

ну, ты это... если что - заходи (с) ;)

 

UPD: к ста, при 1:5 rate 80% (1:10..1:90 ceil 80% соответсвенно) жмёт немного лучше. пожалуй, останусь на нём.

Изменено пользователем cac2s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста. Рад что помог. Вас еще ждет увлекательное путешествие в мир хешированых фильтров, чуть позже, когда нагрузка будет расти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста. Рад что помог. Вас еще ждет увлекательное путешествие в мир хешированых фильтров, чуть позже, когда нагрузка будет расти.

дело в том, что я администрирую небольшой офис, так что хеш-таблицы вряд-ли понадобятся. покрайней мере в ближайшей время...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так а итоговый рабочий скрипт можно ? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.