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

Приоритезациция трафика, выделеная полоса. покритикуйте скриптинку

Есть роутер 2 сетевых интерфейса eth0 - инет, eth1 - локал

 

Хочется добиться приоритезации некоторых видов трафика:

 

1. ICMP

2. порт назначения 80

 

и выделение выделенной полосы для этих типов трафика.

 

пока соорудил следующий скриптик, прошу конструктивной критики:

 

tc qdisc del dev eth0 root    2> /dev/null > /dev/null
tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null
tc qdisc add dev eth0 root handle 1: htb default 4
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Mbit quantum 60000

tc class add dev eth0 parent 1:1 classid 1:3 htb rate 200Mbit ceil 700Mbit quantum 60000
tc qdisc add dev eth0 parent 1:3 handle 3 sfq perturb 10

tc class add dev eth0 parent 1:1 classid 1:4 htb rate 100Mbit ceil 150Mbit quantum 60000
tc qdisc add dev eth0 parent 1:4 handle 4 sfq perturb 10

tc filter add dev eth0 protocol ip parent 1:0 prio 0 u32 match ip dport 80 0xffff flowid 1:3
tc filter add dev eth0 protocol ip parent 1:0 prio 0 u32 match ip protocol 1 0xff flowid 1:3


tc qdisc del dev eth1 root    2> /dev/null > /dev/null
tc qdisc del dev eth1 ingress 2> /dev/null > /dev/null
tc qdisc add dev eth1 root handle 1: htb default 4
tc class add dev eth1 parent 1: classid 1:1 htb rate 1000Mbit quantum 60000

tc class add dev eth1 parent 1:1 classid 1:3 htb rate 200Mbit ceil 700Mbit quantum 60000
tc qdisc add dev eth1 parent 1:3 handle 3 sfq perturb 10

tc class add dev eth1 parent 1:1 classid 1:4 htb rate 100Mbit ceil 150Mbit quantum 60000
tc qdisc add dev eth1 parent 1:4 handle 4 sfq perturb 10

tc filter add dev eth1 protocol ip parent 1:0 prio 0 u32 match ip sport 80 0xffff flowid 1:3
tc filter add dev eth1 protocol ip parent 1:0 prio 0 u32 match ip protocol 1 0xff flowid 1:3

 

Share this post


Link to post
Share on other sites

В Linux приоритезация на основе поля ToS работает по умолчанию (дисциплина pfifo_fast). Т.е. ICMP, SSH и ряд других протоколов, у которых клиенты и серверы правильно выставляют ToS, будут приоритезироваться автоматом без лишних фильтров. Для более продвинутой приоритезации (с возможностью задать произвольный leaf qdisc) логичнее использовать дисциплину prio. В дополнение к этому можно написать фильтры для других типов трафика, у которых не всегда корректно выставлен ToS.

 

tc qdisc add dev $ext_if root handle 1: prio
# high priority (interactive)
tc qdisc add dev $ext_if parent 1:1 handle 10: sfq
# low-latency
tc qdisc add dev $ext_if parent 1:2 handle 20: tbf rate 100mibit burst 100kb latency 50ms minburst 1500
# bulk
tc qdisc add dev $ext_if parent 1:3 handle 30: sfq

tc filter add dev $ext_if parent 1:0 protocol ip pref 1 u32 match ip dport 80 0xffff flowid 1:1

Edited by photon

Share this post


Link to post
Share on other sites

Не совсем понял в чем разница между

tc qdisc add dev $ext_if parent 1:1 handle 10: sfq

и

# bulk
tc qdisc add dev $ext_if parent 1:3 handle 30: sfq

 

Share this post


Link to post
Share on other sites
В Linux приоритезация на основе поля ToS работает по умолчанию (дисциплина pfifo_fast). Т.е. ICMP, SSH и ряд других протоколов, у которых клиенты и серверы правильно выставляют ToS, будут приоритезироваться автоматом без лишних фильтров. Для более продвинутой приоритезации (с возможностью задать произвольный leaf qdisc) логичнее использовать дисциплину prio. В дополнение к этому можно написать фильтры для других типов трафика, у которых не всегда корректно выставлен ToS.

 

tc qdisc add dev $ext_if root handle 1: prio
# high priority (interactive)
tc qdisc add dev $ext_if parent 1:1 handle 10: sfq
# low-latency
tc qdisc add dev $ext_if parent 1:2 handle 20: tbf rate 100mibit burst 100kb latency 50ms minburst 1500
# bulk
tc qdisc add dev $ext_if parent 1:3 handle 30: sfq

tc filter add dev $ext_if parent 1:0 protocol ip pref 1 u32 match ip dport 80 0xffff flowid 1:1

Можно ли добиться приоритезации нужного исходящего трафика сделав так ?

tc qdisc add dev $ext_if root handle 1: prio
tc qdisc add dev $ext_if parent 1:1 handle 10: sfq
tc filter add dev $ext_if parent 1:0 protocol ip pref 1 u32 match ip dport 80 0xffff flowid 1:1

 

Share this post


Link to post
Share on other sites
Да. Я приводил пример похожий на http://lartc.org/howto/lartc.qdisc.classful.html#AEN903

Спасибо за помошь.

Окончательным вариантом не поделитесь?

И еще несколько вопросов:

1. полная "ширина" аплинка у вас какая?

2. сколько Мбит выделено для каждого типа трафика?

3. не нашел, где описан "остаток" полосы (для остального трафика)

4. полосы выделены фиксированно, или есть ли "заем" свободной полосы (например, отдать часть свободной http, или icmp полосы под другой трафик)?

 

Share this post


Link to post
Share on other sites

В случае приоритезации всем типам трафика предоставляется одинаковая полоса пропускания, меняется только порядок отправки пакетов. Смешанные схемы (шейпинг + приоритезация) нужно делать с помощью дисциплины htb или hfsc. Для домашнего использования, когда пакетрейты малы, достаточно prio.

Share this post


Link to post
Share on other sites
В случае приоритезации всем типам трафика предоставляется одинаковая полоса пропускания, меняется только порядок отправки пакетов. Смешанные схемы (шейпинг + приоритезация) нужно делать с помощью дисциплины htb или hfsc. Для домашнего использования, когда пакетрейты малы, достаточно prio.
Шейпинг не нужен, основная задача - обеспечить максимальный приоритет http, ping в меньшей степени. Одновременно еще хотелось бы отдельно обеспечить максимально низкий приоритет p2p (торренту). Т.е. вот такую "иерархию":

 

http

|

icmp

|

все_остальное_кроме_p2p

|

p2p

 

Данный "приоритезатор" нужен для работы на аплинке с макс. полосой около 200 Мбит.

Предлагаемый _INF_ вариант подойдет для такой задачи? Если "да", то что надо добавить для p2p?

Share this post


Link to post
Share on other sites

Достаточно настроить дисциплину prio, как показано по ссылке. Тогда трафик правильно написанных приложений (icmp, интерактивный ssh-трафик, scp) будут назначаться тем или иным очередям по полю ToS, а для http и всего остального нужно дописать фильтры. Если классов обслуживания нужно более трех, придется дополнительно настраивать priomap, как написано в man tc-prio.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this