[РЕШЕНО] tc, ssh (повысить отзывчивость)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модератор: SLEDopit

Ответить
distress
Сообщения: 84
ОС: RHEL5

[РЕШЕНО] tc, ssh

Сообщение distress »

Приветствую. Есть один десктоп(интернет через eth0) с торрент-клиентом без ограничения скорости и исходящими ssh соединениями. Естественно, ssh тормозит. Задержка до 3-4 секунд. Необходимо сделать так, чтобы независимо от использования канала, можно было печатать в ssh сессии без задержек (как будто канал ничем не занят)
этот скрипт

root@host

#!/bin/sh # 1. Сброс правил tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null # 2. Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию tc qdisc add dev eth0 root handle 1:0 htb default 11 # 3. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil) tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit # 4. Указание rate и ceil для очереди 1:10, имеющей наивысший приоритет (0) tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit ceil 100mbit prio 0 # 5. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbit ceil 100mbit prio 5 # 6. ssh в 1:10 tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 1:10


результатов не дал. ssh продолжает тормозить. попробовал проверить - изменил максимально возможную скорость(ceil) в п.5 с 100мбит до 10кбит:

root@host

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbit ceil 10kbit prio 5


скорость скачивания торрентов уменьшилась.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

У вас есть единственный интерфейс в инет и это eth0?

# 3. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil)
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit

У вас таки канал в интернет = 100Мбит? Что-то сомневаюсь. Поставьте скорости согласно тарифному плану провайдера.

И помните - это только исходящий трафик. Возможно забивает как раз входящий. Поэтому вот это:
скорость скачивания торрентов уменьшилась.

Верно только наполовину. Правильнее было бы сказать, что скорость upload уменьшилась. А download зависит от того работает ваш торрент через tcp или через udp.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Alex2ndr писал(а):
22.11.2010 12:25
У вас есть единственный интерфейс в инет и это eth0?

да. инет+локальная сеть.

Alex2ndr писал(а):
22.11.2010 12:25
У вас таки канал в интернет = 100Мбит? Что-то сомневаюсь. Поставьте скорости согласно тарифному плану провайдера.

Канал в интернет 1мбит, скорость в локальной сети до 100мбит. Сеть большая и очень часто встречаются пользователи с необходимой мне раздачей. Кроме того, есть и локальный трекер, который опять же работает по локальной сети на скорости до 100мбит. Именно поэтому я выбрал 100мбит изначально. В идеале я бы не хотел привязываться к скоростям. Хочу просто сделать исходящие соединения на 22 порт с таким наивысшим приоритетом чтобы для них было незаметно есть ли там еще что-то использующее интернет.

Alex2ndr писал(а):
22.11.2010 12:25
Правильнее было бы сказать, что скорость upload уменьшилась. А download зависит от того работает ваш торрент через tcp или через udp.

на момент тестирования я выключил все завершенные раздачи. upload был минимален - где-то 10 килобайт/с и не менялся. после применения измененного п.5 скорость закачки упала. сбросил правила (п.1) - восстановилась.
все замеры делал через conky

conky@config

... ${color #00ff00}v${color 00ff00}${downspeed eth0} ${color #00ff00}^${color 00ff00}${upspeed eth0} ...

Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
22.11.2010 13:41
В идеале я бы не хотел привязываться к скоростям. Хочу просто сделать исходящие соединения на 22 порт с таким наивысшим приоритетом чтобы для них было незаметно есть ли там еще что-то использующее интернет.

А не получится. Или самое узкое место у вас, или у провайдера. И никак иначе. Если у провайдера, то ему на ваш приоритет - пофиг. Почитайте мою недооформленную статью, части 1 и 2. Можно как вариант поиграться с полями QoS но это зависит от того, что админы провайдера навертели. Скорее всего ничего не выйдет.

distress писал(а):
22.11.2010 13:41
на момент тестирования я выключил все завершенные раздачи. upload был минимален - где-то 10 килобайт/с и не менялся. после применения измененного п.5 скорость закачки упала. сбросил правила (п.1) - восстановилась.

Тогда вероятно ваш торрент работает через tcp. Ну это хорошо - вам же легче. Можете ваш торрент одной исходящей резать(удерживая ACK пакеты).

UPD:
Как вариант можно попробовать повесить на ваш интерфейс 2 шейпера. Один будет в локалку шейпить, второй в инет. Сделать этакое дерево из дисциплин, используя PRIO.
Спасибо сказали:
patrius
Сообщения: 337
ОС: Debian (4 & 5) -> Gentoo

Re: [РЕШЕНО] tc, ssh

Сообщение patrius »

distress, на сколько я понимаю ситуацию необходимо ТОЛЬКО повышение приоритета для ssh? если да, то можно попытаться сделать так:
1 трафик ssh "0" приоритет скорость 512Кб.
2. ВЕСЬ остальной трафик - приоритет "3". скорость до 100МБ.
остальные моменты описаны в теме и статье, приведенном Alex2ndr
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

patrius писал(а):
22.11.2010 15:37
distress, на сколько я понимаю ситуацию необходимо ТОЛЬКО повышение приоритета для ssh? если да, то можно попытаться сделать так:
1 трафик ssh "0" приоритет скорость 512Кб.
2. ВЕСЬ остальной трафик - приоритет "3". скорость до 100МБ.
остальные моменты описаны в теме и статье, приведенном Alex2ndr

Эхе хе.... Вот вы тоже не понимаете. Если делать с одним корнем и поставить на нем 100Мбит, то в очередях трафик будет стоять у провайдера, а не у вас. Соответственно работать шейпер не будет(точнее будет - но у прова). Ну как мне еще вам доказать? Говорите как вы себе это представляете - попробую пояснить понятными словами. Я уже год с лишним занимаюсь этим L4 switching... Единственный вариант - отделить трафик идущий в локалку от очереди в инет. Тогда на очереди в инет можно поставить скорость МЕНЬШЕ чем у провайдера и получить управление трафиком на своем шейпере.

PS В той статье картинки с хостинга удалились похоже. Если кому нить нужны, то пишите в личку - вышлю. Надеюсь у меня когда-нить дойдут руки сделать оставшиеся картинки и нормально опубликовать сей опус... :(
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Попробую от простого к сложному.
Alex2ndr писал(а):
22.11.2010 12:25
У вас таки канал в интернет = 100Мбит? Что-то сомневаюсь. Поставьте скорости согласно тарифному плану провайдера.

Пусть будет только канал в интерент со скоростью 1мбит. Чтобы было проще сравнивать с торрентом и коньками - скорости будут килобайтами в секунду(kbps). Чтобы не превысить скорость, разрешенную провайдером, будет 100kbps вместо 128kbps.

root@host

# 1. Сброс правил tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null # 2. Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию tc qdisc add dev eth0 root handle 1:0 htb default 11 # 3. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil) tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100kbps ceil 100kbps # 4. Указание rate и ceil для очереди 1:10, имеющей наивысший приоритет (0) tc class add dev eth0 parent 1:1 classid 1:10 htb rate 99kbps ceil 100kbps prio 0 # 5. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbps ceil 100kbps prio 5 # 6. ssh в 1:10 tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 1:10


включаю раздачи/закачки в торренте. приходит 128kbps, уходит 100kbps(как указано в п.5 ).
теперь уменьшу в п.5 значение ceil до 25kbps:

root@host

... # 5. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbps ceil 25kbps prio 5 ...


Уходит 25kbps. а вот скорость закачки начала прыгать от 60kbps до 120kbps. поведение ssh почти не изменилось. На короткое время начинает работать без задержки, а потом опять тормозит. Кроме того, все раздачи в торренте почти остановились - исходящая скорость то ограничена.
Спасибо сказали:
alex_suse
Сообщения: 204
ОС: Debian, openSUSE, Gentoo

Re: [РЕШЕНО] tc, ssh

Сообщение alex_suse »

А что тут неясного, у вашей ssh сессии есть тоже входящий траффик, который tc не регулируется и канал входящий забивает торрент.
Надо регулировать еще и исходящий в локалку, чтобы его разделить с внутренним трекером маркировка в iptables.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

alex_suse писал(а):
23.11.2010 09:57
А что тут неясного, у вашей ssh сессии есть тоже входящий траффик, который tc не регулируется и канал входящий забивает торрент.

Его как-то возможно регулировать? Не ограничивая скорость в клиенте, а на уровне ОС и динамически, как это делает tc для исходящего.

alex_suse писал(а):
23.11.2010 09:57
Надо регулировать еще и исходящий в локалку, чтобы его разделить с внутренним трекером маркировка в iptables.

Чтобы не усложнять, пусть локалки пока не будет. Если удастся добиться требуемых результатов с простым примером - буду уже пытаться впиливать распределение скоростей для локальной сети.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
23.11.2010 00:19
Попробую от простого к сложному.
Alex2ndr писал(а):
22.11.2010 12:25
У вас таки канал в интернет = 100Мбит? Что-то сомневаюсь. Поставьте скорости согласно тарифному плану провайдера.

Пусть будет только канал в интерент со скоростью 1мбит. Чтобы было проще сравнивать с торрентом и коньками - скорости будут килобайтами в секунду(kbps). Чтобы не превысить скорость, разрешенную провайдером, будет 100kbps вместо 128kbps.

root@host

# 1. Сброс правил tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null # 2. Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию tc qdisc add dev eth0 root handle 1:0 htb default 11 # 3. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil) tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100kbps ceil 100kbps # 4. Указание rate и ceil для очереди 1:10, имеющей наивысший приоритет (0) tc class add dev eth0 parent 1:1 classid 1:10 htb rate 99kbps ceil 100kbps prio 0 # 5. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbps ceil 100kbps prio 5 # 6. ssh в 1:10 tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 1:10


включаю раздачи/закачки в торренте. приходит 128kbps, уходит 100kbps(как указано в п.5 ).
теперь уменьшу в п.5 значение ceil до 25kbps:

root@host

... # 5. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbps ceil 25kbps prio 5 ...


Уходит 25kbps. а вот скорость закачки начала прыгать от 60kbps до 120kbps. поведение ssh почти не изменилось. На короткое время начинает работать без задержки, а потом опять тормозит. Кроме того, все раздачи в торренте почти остановились - исходящая скорость то ограничена.

Отлично. Ставим такой вот эксперимент. Посмотрел на ваши правила внимательнее и не увидел там очередей. Классы вижу, фильтр тоже, а вот очередей (qdisk) почему-то нету. Вообщем вот вам мой вариант - пробуйте его.

root@host

# 1. Сброс правил tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null # 2. Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию tc qdisc add dev eth0 root handle 1:0 htb default 11 # 3. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil) tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100kbps ceil 100kbps # 4. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1kbps ceil 100kbps prio 5 tc qdisc add dev eth0 parent 1:11 handle 11: sfq perturb 10 # 5. Указание rate и ceil для очереди 1:10, имеющей наивысший приоритет (0) tc class add dev eth0 parent 1:1 classid 1:10 htb rate 99kbps ceil 100kbps prio 0 tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 # Фильтруем в очередь 1:10 ssh трафик tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 1:10


Я немного перебрал порядок под логичный для меня, но в целом добавил только 2 строки. Попробуйте так. Если не получится будем мутить шейпер на входящий.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Поэкспериментировал с новым скриптом.
список

root@host

# tc qdisc show dev eth0 qdisc htb 1: root refcnt 2 r2q 10 default 11 direct_packets_stat 2 qdisc sfq 11: parent 1:11 limit 127p quantum 1514b perturb 10sec qdisc sfq 10: parent 1:10 limit 127p quantum 1514b perturb 10sec


пополнился: как и положено, добавились еще 2 строки(раньше была только одна - первая). менял значение ceil в п.4 скрипта результат тот же - на некоторм значении водящий траффик начинает прыгать, ssh продолжает тормозить, а раздачи останавливаются.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

Вот вам шейпер на входящий трафик:

Код: Выделить всё

modprobe ifb
ip link set ifb0 up
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

# 2. Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию
tc qdisc add dev ifb0 root handle 1:0 htb default 11

# 3. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil)
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 100kbps

# 4. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5)
tc class add dev ifb0 parent 1:1 classid 1:11 htb rate 1kbps ceil 100kbps prio 5
tc qdisc add dev ifb0 parent 1:11 handle 11: sfq perturb 10

# 5. Указание rate и ceil для очереди 1:10, имеющей наивысший приоритет (0)
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 99kbps ceil 100kbps prio 0
tc qdisc add dev ifb0 parent 1:10 handle 10: sfq perturb 10
# Фильтруем в очередь 1:10 ssh трафик
TC filter add dev ifb0 parent 1:0 protocol ip prio 0 u32 match ip sport 22 0xffff flowid 1:10

Пробуйте. Несколько моментов:
1. Обязательно с помошью tc -s qdisc show dev eth0 и tc -s qdisc show dev ifb0 проверяйте наличие пакетов в очередях.
2. Как останавливать вариант с ifb надеюсь разберетесь сами.
3. Скорости тоже отрегулируете сами.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Прекрасно! Теперь всё работает как надо - торрент качает на максимальной скорости, ssh не тормозит при этом. Удивительно, что ни один пример(а их было не меньше десяти), который я пытался допилить под себя, не использовал ifb и, естественно, не работал как надо. Вот что у меня получилось в результате:

Код:

#!/bin/sh # 1. Cброс ifb ip link set ifb0 down rmmod ifb 2> /dev/null > /dev/null modprobe ifb ip link set ifb0 up # 2. Сброс правил tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null tc qdisc del dev ifb0 root 2> /dev/null > /dev/null tc qdisc del dev ifb0 ingress 2> /dev/null > /dev/null # 3. Перенаправить все IP пакеты, приходящие в eth0, на ifb0 tc qdisc add dev eth0 handle ffff: ingress tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0 # 4. Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию tc qdisc add dev ifb0 root handle 1:0 htb default 11 # 5. Указание ширины гарантированной полосы (rate) и максимально возможной (ceil) tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 120kbps # 6. Указание rate и ceil для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5) tc class add dev ifb0 parent 1:1 classid 1:11 htb rate 1kbps ceil 120kbps prio 5 tc qdisc add dev ifb0 parent 1:11 handle 11: sfq perturb 10 # 7. Указание rate и ceil для очереди 1:10, имеющей наивысший приоритет (0) tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 100kbps ceil 120kbps prio 0 tc qdisc add dev ifb0 parent 1:10 handle 10: sfq perturb 10 # 8. Фильтруем в очередь 1:10 ssh трафик tc filter add dev ifb0 parent 1:0 protocol ip prio 0 u32 match ip sport 22 0xffff flowid 1:10

Покрутил скорость, подобрал максимальную - 120килобайт/c.

Alex2ndr писал(а):
24.11.2010 15:14
1. Обязательно с помошью tc -s qdisc show dev eth0 и tc -s qdisc show dev ifb0 проверяйте наличие пакетов в очередях.

Проверил. Не заметил ничего плохого кроме периодически прирастающего значения dropped и overlimits в очередях для ifb0. Всё правильно?

дисциплины@eth0

# tc -s qdisc show dev eth0; qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 1997705520 bytes 9999092 pkt (dropped 0, overlimits 0 requeues 113140) backlog 0b 0p requeues 113140 qdisc ingress ffff: parent ffff:fff1 ---------------- Sent 76770963 bytes 133919 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0



дисциплины@ifb0

# tc -s qdisc show dev ifb0; qdisc htb 1: root refcnt 2 r2q 10 default 11 direct_packets_stat 0 Sent 74299871 bytes 104660 pkt (dropped 16709, overlimits 230979 requeues 0) backlog 0b 48p requeues 0 qdisc sfq 11: parent 1:11 limit 127p quantum 1514b perturb 10sec Sent 42162767 bytes 81117 pkt (dropped 16651, overlimits 0 requeues 0) backlog 24280b 48p requeues 0 qdisc sfq 10: parent 1:10 limit 127p quantum 1514b perturb 10sec Sent 32133242 bytes 23536 pkt (dropped 58, overlimits 0 requeues 0) backlog 0b 0p requeues 0



Теперь, чтобы получить наиболее полный шейпер на входящий и исходящий трафик, мне нужно собрать вместе оба скрипта?
Догадываюсь, что для локального трафика (без ограничений) понадобится еще один ifb. В него направить пакеты из локальной подсети и дальше делать всё как с этим примером для интернета. Т.е. в результате у меня получится 4 шейпера для локального и интернет трафика на всходящие и исходящие пакеты. Я правильно рассуждаю?
Кроме того, есть еще одна проблема. У провайдера много локальных подсетей - пару десятков. Некоторые из них - старые без внешних IP. Некоторые с внешними. Старые адреса постепенно меняются на новые, постояно добавляются новые подсети. И я пока не придумал как можно кроме отлавливания адресов и составления по ним вручную списка подсетей, разделять трафик на локальный и нелокальный. Возможно, это как-то смогло бы помочь автоматизировать процесс: 1) трасса до локальных адресов короткая, всего 2-3 узла. 2) у всех локальных адресов есть dns запись типа 'некий-уникальный-ID.провайдер.net'. У меня из настроек только default route, а провайдер уже сам решает куда ограничить скорость, а куда пустить на полной.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
25.11.2010 10:29
Прекрасно! Теперь всё работает как надо - торрент качает на максимальной скорости, ssh не тормозит при этом. Удивительно, что ни один пример(а их было не меньше десяти), который я пытался допилить под себя, не использовал ifb и, естественно, не работал как надо.

Значит основной затык у вас был на входящей полосе, а не на исходящей. А насчет примеров... обычно все примеры приводятся для шлюза между LAN и WAN. Шейпер на локальной машине кроме как у вас больше нигде не встречал. Конечно для шлюза тоже иногда есть нужда шейпить локальный трафик, но довольно редко. А просто транзитный можно и без ifb, когда есть 2 интерфейса. Кроме того об этом фокусе знает весьма небольшое кол-во тех кто хоть как-то использует шейпер(да и вообще понимают как он работает тоже небольшое кол-во). Все где-то прочитали, что "шейпить входящий трафик нельзя", но не разобрались что это обозначает. А это на самом деле значит простую вещь - "шейпить трафик во входящей очереди интерфейса - нельзя". Поэтому поднимаем виртуальный интерфейс, переправляем входящую очередь реального на исходящую виртуального и вуаля - имеем шейпер входящего трафика.

distress писал(а):
25.11.2010 10:29
Проверил. Не заметил ничего плохого кроме периодически прирастающего значения dropped и overlimits в очередях для ifb0. Всё правильно?

Ну рассуждайте логично. У нас есть 2 ведра. Из 1-го мы переливаем во второе, когда первое наполнится. А из второго мы выливаем реже, чем первое наполняется. Куда уйдет излишек воды? Правильно - выльется на землю в момент переполнения второго ведра. Вот и тут то же самое - часть пакетов выкидывается(dropped) когда очередь переполняется.
Говоря про наблюдение за пакетами в очередях я исходил из своего практического опыта отладки шейперов полос на 50-100. Прежде всего необходимо определить попадают ли пакеты в очереди, чтобы понять почему именно шейпер работает неправильно. с 2-мя очередями этой проблемы наверное нету... Но все равно можно ошибится в написании фильтра.

distress писал(а):
25.11.2010 10:29
Теперь, чтобы получить наиболее полный шейпер на входящий и исходящий трафик, мне нужно собрать вместе оба скрипта?

Правильно рассуждаете.

distress писал(а):
25.11.2010 10:29
Догадываюсь, что для локального трафика (без ограничений) понадобится еще один ifb. В него направить пакеты из локальной подсети и дальше делать всё как с этим примером для интернета. Т.е. в результате у меня получится 4 шейпера для локального и интернет трафика на всходящие и исходящие пакеты. Я правильно рассуждаю?

Вот тут ваше предположение не верно. Еще один ifb не понадобится. И нельзя сказать что будет 4 шейпера. Будет 2 шейпера - для входящего трафика и для исходящего. Суть в еще одном корне для распределения трафика. Т е будет более сложное дерево распределения. Я это себе представляю примерно так(для одного направления):
1. Дисциплина верхнего уровня. Можно даже не htb а prio - она попроще.
2. К ней присоединяются 2 дисциплины среднего уровня:
2.1 Дисциплина для локального трафика(имеет приоритет например 10). Какая-нить простая типа pfifo. Без ограничения, вообще без всего. Только чтобы была. Плюс фильтры, которые отсекают в эту полосу локальный трафик. Наверное на основании адресов назначения пакетов - по внутренним подсетям. Фильтров может быть сколько угодно - по одному на каждую подсеть например. Просто дисциплина назначения будет у всех одинаковая.
2.2 Дисциплина для внешнего трафика(имеет приоритет например 1). Именно здесь и будет ваш текущий шейпер. Т е все что было у вас до этого будет расти из этого пункта. В текущих в самом верхнем просто поменяется значение родительской полосы - она будет не 1:0 а какая-нить 1:2 и тд - как решите.
Советую ознакомится с моей статьей, часть 3 и с LARTC.

distress писал(а):
25.11.2010 10:29
Кроме того, есть еще одна проблема. У провайдера много локальных подсетей - пару десятков. Некоторые из них - старые без внешних IP. Некоторые с внешними. Старые адреса постепенно меняются на новые, постояно добавляются новые подсети. И я пока не придумал как можно кроме отлавливания адресов и составления по ним вручную списка подсетей, разделять трафик на локальный и нелокальный. Возможно, это как-то смогло бы помочь автоматизировать процесс: 1) трасса до локальных адресов короткая, всего 2-3 узла. 2) у всех локальных адресов есть dns запись типа 'некий-уникальный-ID.провайдер.net'. У меня из настроек только default route, а провайдер уже сам решает куда ограничить скорость, а куда пустить на полной.

Кроме как выявления всех подсетей больше пожалуй ничего не посоветую. Разве что как-то получить всю зону с провайдерского днс... Но тут я не силен. Все равно для шейпера это все придет к набору адресов сетей - иначе ему информацию не скормить. Возможно получится объединить все адреса в подсеть с более общей маской(т е методом переменных масок ), что позволить сэкономить на правилах. Возможно получится обобщить по принципу - все локальные адреса начинаются например с 10 или со 192 и тд. Эти диапазоны в глобальных сетях не используются. Ну и конечно наблюдение за скоростью и сидами на трекере. Возможно все подсети и не нужно получить - достаточно знать где ретрекеры стоят. Вообщем начните с малого, постепенно пополняя свою базу адресов.

А может можно принести пиво какому-нить админу провайдера и он все сам отдаст? :)
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Alex2ndr писал(а):
25.11.2010 12:06
...обычно все примеры приводятся для шлюза между LAN и WAN.

да. так оно и есть. после нескольких дней усиленного ковыряния шейпера я это вижу, перечитывая примеры. кстати, не во всех было сказано что они для шлюза.
Alex2ndr писал(а):
25.11.2010 12:06
Шейпер на локальной машине кроме как у вас больше нигде не встречал.

Странно. Я всегда считал эту задачу достаточно актуальной. Не у всех есть шлюз, не каждый шлюз умеет шейпинг, многие 'железные' шлюзы умеют торренты(ну и обычные шлюзы конечно же тоже умеют качать). Во всех трех случаях нужно делать шейпинг на локальной машине(в последнем - локально на шлюзе).
Alex2ndr писал(а):
25.11.2010 12:06
1. Дисциплина верхнего уровня. Можно даже не htb а prio - она попроще.
2. К ней присоединяются 2 дисциплины среднего уровня:
2.1 Дисциплина для локального трафика(имеет приоритет например 10). Какая-нить простая типа pfifo. Без ограничения, вообще без всего. Только чтобы была. Плюс фильтры, которые отсекают в эту полосу локальный трафик. Наверное на основании адресов назначения пакетов - по внутренним подсетям. Фильтров может быть сколько угодно - по одному на каждую подсеть например. Просто дисциплина назначения будет у всех одинаковая.
2.2 Дисциплина для внешнего трафика(имеет приоритет например 1). Именно здесь и будет ваш текущий шейпер. Т е все что было у вас до этого будет расти из этого пункта. В текущих в самом верхнем просто поменяется значение родительской полосы - она будет не 1:0 а какая-нить 1:2 и тд - как решите.

небольшой грубый пример как я себе это представляю (для уменьшения количества текста пусть изначально все правила будут сброшены, а ifb0 поднято и готово к работе):

prio@ifb0

... # [1] tc qdisc add dev ifb0 root handle 1: prio bands 2 priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 #[2.1] tc qdisc add dev ifb0 parent 1:2 handle 20: pfifo #[2.2] tc qdisc add dev ifb0 parent 1:1 handle 10:0 htb default 11 ...


В скобках указан пункт плана, соответствующий добавленной дисциплине. Не нашел другого способа расставить приоритеты по плану для дисциплины prio, кроме как через priomap. К корневой дисциплине 10:0 буду присоединять оставшиеся классы htb и очереди из прошлого скрипта.
Фильтры будут примерно такие:

filters@

tc filter add dev ifb0 parent 1:0 <параметры, локальная-подсеть-1> flowid 1:2 tc filter add dev ifb0 parent 1:0 <параметры, локальная-подсеть-2> flowid 1:2 ... tc filter add dev ifb0 parent 1:0 <параметры, локальная-подсеть-n> flowid 1:2


фильтры направлены в 1:2 как и положено локальному трафику. Остальной трафик вроде бы идет самостоятельно в 1:1 т.к. в priomap установлен бОльший приоритет для этого класса.
Всё правильно делаю?

Alex2ndr писал(а):
25.11.2010 12:06
А может можно принести пиво какому-нить админу провайдера и он все сам отдаст?

Надо попробовать. С адресами так или иначе справлюсь - это не шейпер настроить. :)
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
26.11.2010 02:24
Странно. Я всегда считал эту задачу достаточно актуальной. Не у всех есть шлюз, не каждый шлюз умеет шейпинг, многие 'железные' шлюзы умеют торренты(ну и обычные шлюзы конечно же тоже умеют качать). Во всех трех случаях нужно делать шейпинг на локальной машине(в последнем - локально на шлюзе).

Ну где-то она бывает нужной наверное. В репах Дебиана даже есть пакет wondershaper, который как раз "шейпит" трафик для локальной машины. Кстати не советую еспользовать, т к цели, которые преследовал его автор, мне непонятны. Самый распространенный вариант входящего шейпера это как раз локальный трафик шлюза. Но там свои грабли, из-за NAT. Можно сказать что у вас еще простенько получилось. Я с IMQ разбирался с месяцок... потом оказалось что ядро неправильно собрал... Можно сказать, что до сих пор я знаю этот вопрос больше в теории.

distress писал(а):
26.11.2010 02:24
небольшой грубый пример как я себе это представляю (для уменьшения количества текста пусть изначально все правила будут сброшены, а ifb0 поднято и готово к работе):

prio@ifb0

... # [1] tc qdisc add dev ifb0 root handle 1: prio bands 2 priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 #[2.1] tc qdisc add dev ifb0 parent 1:2 handle 20: pfifo #[2.2] tc qdisc add dev ifb0 parent 1:1 handle 10:0 htb default 11 ...


В скобках указан пункт плана, соответствующий добавленной дисциплине. Не нашел другого способа расставить приоритеты по плану для дисциплины prio, кроме как через priomap. К корневой дисциплине 10:0 буду присоединять оставшиеся классы htb и очереди из прошлого скрипта.
Фильтры будут примерно такие:

filters@

tc filter add dev ifb0 parent 1:0 <параметры, локальная-подсеть-1> flowid 1:2 tc filter add dev ifb0 parent 1:0 <параметры, локальная-подсеть-2> flowid 1:2 ... tc filter add dev ifb0 parent 1:0 <параметры, локальная-подсеть-n> flowid 1:2


фильтры направлены в 1:2 как и положено локальному трафику. Остальной трафик вроде бы идет самостоятельно в 1:1 т.к. в priomap установлен бОльший приоритет для этого класса.
Всё правильно делаю?

Я с prio совсем не работал - только с HTB. Сча почитал про нее. В LARTC инфы мало, в man tc-prio чуть больше но тоже загадочно. Не совсем ясно в какую полосу пойдет трафик, который не попал в фильтры. Сказано что распределится по приоритету т е по значению поля QoS в заголовке IP пакета. Но этаким способом может получится совсем не то, что нам нужно. Поэтому, возможно, стоит использовать привычную HTB с указанием в default нужного нам класса. Писанины чуть больше, но мне кажется будет более понятно. Впрочем, если вы разобрались с prio, то оставьте как есть. Можно так же подумать над фильтром, в который попадет любой трафик, но который будет применяться после всех остальных. Типа такого:

filters@

tc filter add dev ifb0 parent 1:0 prio 1 <параметры, локальная-подсеть-1> flowid 1:2 tc filter add dev ifb0 parent 1:0 prio 2 <параметры, локальная-подсеть-2> flowid 1:2 ... tc filter add dev ifb0 parent 1:0 prio n <параметры, локальная-подсеть-n> flowid 1:2 tc filter add dev ifb0 parent 1:0 prio n+1 <параметры, 0.0.0.0/0> flowid 1:1


Но HTB мне нравится больше... Возможно просто привычнее.

Как сделаете выкладывайте - подумаем что еще можно сделать и как оптимизировать. Ну и народу наверное пригодится... Этакий нормальный аналог wondershaper...
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Alex2ndr писал(а):
26.11.2010 11:53
В репах Дебиана даже есть пакет wondershaper, который как раз "шейпит" трафик для локальной машины. Кстати не советую еспользовать, т к цели, которые преследовал его автор, мне непонятны.

Использовал его еще до того, как создал тему. Точнее не использовал, а запустил и посмотрел, что ничего не изменилось. Попробовал переделать кое-как - опять безрезультатно. Я не сомневаюсь, что он работал, но не так как мне надо ни до ни, тем более ,после моих исправлений.

Alex2ndr писал(а):
26.11.2010 11:53
Как сделаете выкладывайте - подумаем что еще можно сделать и как оптимизировать. Ну и народу наверное пригодится... Этакий нормальный аналог wondershaper...

тестовая версия готова. сделал на htb. собрал всё в кучу, протестировал, чтобы каждый тип пакетов попадал куда надо. уже пару часов работают 2 торрент клиента и осёл. ssh стабильно не тормозит. кроме терминалов запустил еще 2 vnc клиента через ssh - тоже всё хорошо(раньше автоматически уменьшалась глубина цвета, а изменения отображались раз в 5-10 секунд).

Код:

#!/bin/sh # 1. Cброс ifb ip link set ifb0 down rmmod ifb 2> /dev/null > /dev/null modprobe ifb ip link set ifb0 up # 2. Сброс правил tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null tc qdisc del dev ifb0 root 2> /dev/null > /dev/null tc qdisc del dev ifb0 ingress 2> /dev/null > /dev/null if [ "${1}" == "stop" ]; then exit; fi # 3. Перенаправить все IP пакеты, приходящие в eth0, на ifb0 tc qdisc add dev eth0 handle ffff: ingress tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0 # # >>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<< # >>> шейпер входящего трафика <<< # >>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<< # # 4. o-----o o-----o tc qdisc add dev ifb0 root handle 1:0 htb default 3 #......................................... | 1:0 | | | - очередь или дисциплина # o-----o o-----o # # ,-----, # V | | - класс # 5. ,-----, `-----` tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit #................... | 1:1 | # `-----` # # # # - тут будет трафик, который # V # не попал в фильтры # ,________/ \########## V # | # # 6. V V tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 1mbit ceil 100mbit prio 10 # ,-----, ,-----, # ... | 1:2 |............. | 1:3 | tc class add dev ifb0 parent 1:1 classid 1:3 htb rate 100mbit ceil 100mbit prio 1 # `-----` `-----` # | # # V # # 7. o------o # tc qdisc add dev ifb0 parent 1:2 handle 10:0 pfifo #................................ | 10:0 | # # o------o # # выход локального # # трафика V # 8. o-----o tc qdisc add dev ifb0 parent 1:3 handle 3:0 htb default 3 #.............................................. | 3:0 | # o-----o # # # V # 9. ,-----, tc class add dev ifb0 parent 3:0 classid 3:1 htb rate 120kbps #.......................................... | 3:1 | # `-----` # # # V # ,________/ \########## # | # # 10. V V tc class add dev ifb0 parent 3:1 classid 3:2 htb rate 120kbps prio 1 # ,-----, ,-----, # .............. | 3:2 |..............| 3:3 | tc class add dev ifb0 parent 3:1 classid 3:3 htb rate 1kbps ceil 120kbps prio 10 # `-----` `-----` # | # # V # # 11. o------o # tc qdisc add dev ifb0 parent 3:2 handle 20:0 sfq perturb 10 #................................... | 20:0 | # # o------o # # выход интернет # # трафика для ssh # # (высокий приоритет 1) V # 12. o------o tc qdisc add dev ifb0 parent 3:3 handle 30:0 sfq perturb 10 #.......................................................... | 30:0 | # o------o # выход интернет # трафика по умолчанию # (низкий приоритет 10) #[default] - не используется #tc filter add dev ifb0 parent 3:0 protocol ip prio 3 u32 match ip src 0.0.0.0/0 flowid 3:1 # 13. [ssh] tc filter add dev ifb0 parent 3:0 protocol ip prio 0 u32 match ip sport 22 0xffff flowid 3:2 # 14. локальный трафик tc filter add dev ifb0 parent 1:0 protocol ip prio 1 u32 match ip src 192.0.0.0/8 flowid 1:2 tc filter add dev ifb0 parent 1:0 protocol ip prio 2 u32 match ip src 10.0.0.0/8 flowid 1:2 tc filter add dev ifb0 parent 1:0 protocol ip prio 2 u32 match ip src my.isp.ip.range/24 flowid 1:2 # # >>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<< # >>> шейпер исходящего трафика <<< # >>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<< # # 15. o-----o o-----o tc qdisc add dev eth0 root handle 1:0 htb default 3 #......................................... | 1:0 | | | - очередь или дисциплина # o-----o o-----o # # ,-----, # V | | - класс # 16. ,-----, `-----` tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit #................... | 1:1 | # `-----` # # # # - тут будет трафик, который # V # не попал в фильтры # ,________/ \########## V # | # # 17. V V tc class add dev eth0 parent 1:1 classid 1:2 htb rate 1mbit ceil 100mbit prio 10 # ,-----, ,-----, # ... | 1:2 |............. | 1:3 | tc class add dev eth0 parent 1:1 classid 1:3 htb rate 100mbit ceil 100mbit prio 1 # `-----` `-----` # | # # V # # 18. o------o # tc qdisc add dev eth0 parent 1:2 handle 10:0 pfifo #................................ | 10:0 | # # o------o # # выход локального # # трафика V # 19. o-----o tc qdisc add dev eth0 parent 1:3 handle 3:0 htb default 3 #.............................................. | 3:0 | # o-----o # # # V # 20. ,-----, tc class add dev eth0 parent 3:0 classid 3:1 htb rate 120kbps #.......................................... | 3:1 | # `-----` # # # V # ,________/ \########## # | # # 21. V V tc class add dev eth0 parent 3:1 classid 3:2 htb rate 120kbps prio 1 # ,-----, ,-----, # .............. | 3:2 |..............| 3:3 | tc class add dev eth0 parent 3:1 classid 3:3 htb rate 1kbps ceil 120kbps prio 10 # `-----` `-----` # | # # V # # 22. o------o # tc qdisc add dev eth0 parent 3:2 handle 20:0 sfq perturb 10 #................................... | 20:0 | # # o------o # # выход интернет # # трафика для ssh # # (высокий приоритет 1) V # 24. o------o tc qdisc add dev eth0 parent 3:3 handle 30:0 sfq perturb 10 #.......................................................... | 30:0 | # o------o # выход интернет # трафика по умолчанию # (низкий приоритет 10) #[default] - не используется #tc filter add dev ifb0 parent 3:0 protocol ip prio 3 u32 match ip dst 0.0.0.0/0 flowid 3:1 # 24. [ssh] tc filter add dev eth0 parent 3:0 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 3:2 # 25. локальный трафик tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.0.0.0/8 flowid 1:2 tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip dst 10.0.0.0/8 flowid 1:2 tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip dst my.isp.ip.range/24 flowid 1:2

В редакторе, понимающем shell синтаксис, будет смотреться лучше.
с фильтрами получилось совсем просто. сначала добавил локальные подсети 10 и 192.
Подсмотрел в $ whois свой.ip диапазоны IP адресов провайдера. По ним посчитал маски и добавил фильтры для внешней подсети.
Если сильно приспичит - добавить фильтры для icq/jabber/www достаточно просто. Можно еще попробовать прикрутить повышенные приоритеты для скайпа, но у него там вроде бы нет определенных портов.
Вобщем любая критика приветствуется.

UPD: когда наблюдал за классами - заметил вот это. sfq размножается.

root@host

# tc -s class show dev ifb0 ... class sfq 20:2ac parent 20: (dropped 0, overlimits 0 requeues 0) backlog 0b 1p requeues 0 allot 1448 class sfq 30:29 parent 30: (dropped 0, overlimits 0 requeues 0) backlog 0b 1p requeues 0 allot 5894 class sfq 30:61 parent 30: (dropped 0, overlimits 0 requeues 0) backlog 0b 1p requeues 0 allot 19076 class sfq 30:70 parent 30: (dropped 0, overlimits 0 requeues 0) backlog 0b 2p requeues 0 allot 1514 class sfq 30:81 parent 30: (dropped 0, overlimits 0 requeues 0) backlog 0b 7p requeues 0 allot 4542 ...

Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
27.11.2010 01:24
Использовал его еще до того, как создал тему. Точнее не использовал, а запустил и посмотрел, что ничего не изменилось. Попробовал переделать кое-как - опять безрезультатно. Я не сомневаюсь, что он работал, но не так как мне надо ни до ни, тем более ,после моих исправлений.

Там все хитро :) Исходящий трафик ограничивается наподобии вашего первого варианта, только через CBQ, которая гораздо сложнее и слабо подходит для малозагруженных каналов. Со входящим же вообще прикол - входящего шейпера там нету, только ограничитель(т е полисер) входящей скорости. Зачем он такой нужен - я не знаю. Поскольку вам нужно шейпить именно входящий трафик, то он вам никаким боком не пойдет.

distress писал(а):
27.11.2010 01:24
тестовая версия готова. сделал на htb. собрал всё в кучу, протестировал, чтобы каждый тип пакетов попадал куда надо. уже пару часов работают 2 торрент клиента и осёл. ssh стабильно не тормозит. кроме терминалов запустил еще 2 vnc клиента через ssh - тоже всё хорошо(раньше автоматически уменьшалась глубина цвета, а изменения отображались раз в 5-10 секунд). В редакторе, понимающем shell синтаксис, будет смотреться лучше.
с фильтрами получилось совсем просто. сначала добавил локальные подсети 10 и 192.
Подсмотрел в $ whois свой.ip диапазоны IP адресов провайдера. По ним посчитал маски и добавил фильтры для внешней подсети. Если сильно приспичит - добавить фильтры для icq/jabber/www достаточно просто. Можно еще попробовать прикрутить повышенные приоритеты для скайпа, но у него там вроде бы нет определенных портов.
Вобщем любая критика приветствуется.

ANSII арт в коде это как-то... напрягает. Если нужна схема, то имхо стоит нарисовать ее отдельно. Поэтому я выдрал из вашего текста код(регулярками в vim) и оформил его как полагается для скрипта. Нужно дополнить комментами и будет совсем хорошо.

Код: Выделить всё

#!/bin/bash

MY_ISP_IP_RANGE="193.1.0.0/24"

stop_shaper(){
    tc qdisc del dev eth0 root &> /dev/null
    tc qdisc del dev eth0 ingress &> /dev/null
    tc qdisc del dev ifb0 root &> /dev/null
    tc qdisc del dev ifb0 ingress &> /dev/null
    ip link set ifb0 down
    rmmod ifb &> /dev/null
}

start_shaper(){
    modprobe ifb
    ip link set ifb0 up
    # 3. Перенаправить все IP пакеты, приходящие в eth0, на ifb0
    tc qdisc add dev eth0 handle ffff: ingress
    tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

    # >>> шейпер входящего трафика <<<
    # Корневая полоса, общая для локального и внешнего трафика.
    tc qdisc add dev ifb0 root handle 1:0 htb default 3
    tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit

    # Полоса для локального трафика
    tc class add dev ifb0 parent 1:1 classid 1:3 htb rate 100mbit ceil 100mbit prio 1
    tc qdisc add dev ifb0 parent 1:2 handle 10:0 pfifo
    tc filter add dev ifb0 parent 1:0 protocol ip prio 1 u32 match ip src 192.0.0.0/8 flowid 1:2
    tc filter add dev ifb0 parent 1:0 protocol ip prio 2 u32 match ip src 10.0.0.0/8 flowid 1:2
    tc filter add dev ifb0 parent 1:0 protocol ip prio 3 u32 match ip src $MY_ISP_IP_RANGE flowid 1:2

    # Полоса для внешнего трафика
    tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 1mbit prio 10
    tc qdisc add dev ifb0 parent 1:3 handle 3:0 htb default 3
    # Распределение для внешнего трафика по полосам.
    tc class add dev ifb0 parent 3:0 classid 3:1 htb rate 120kbps
    tc class add dev ifb0 parent 3:1 classid 3:2 htb rate 120kbps prio 1
    tc class add dev ifb0 parent 3:1 classid 3:3 htb rate 1kbps ceil 120kbps prio 10
    tc qdisc add dev ifb0 parent 3:2 handle 20:0 sfq perturb 10
    tc qdisc add dev ifb0 parent 3:3 handle 30:0 sfq perturb 10
    tc filter add dev ifb0 parent 3:0 protocol ip prio 0 u32 match ip sport 22 0xffff flowid 3:2

    # >>> шейпер исходящего трафика <<<
    # Корневая полоса, общая для локального и внешнего трафика.
    tc qdisc add dev eth0 root handle 1:0 htb default 3
    tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit

    # Полоса для локального трафика
    tc class add dev eth0 parent 1:1 classid 1:3 htb rate 100mbit ceil 100mbit prio 1
    tc qdisc add dev eth0 parent 1:2 handle 10:0 pfifo
    tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.0.0.0/8 flowid 1:2
    tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip dst 10.0.0.0/8 flowid 1:2
    tc filter add dev eth0 parent 1:0 protocol ip prio 3 u32 match ip dst $MY_ISP_IP_RANGE flowid 1:2

    # Полоса для внешнего трафика
    tc class add dev eth0 parent 1:1 classid 1:2 htb rate 1mbit prio 10
    tc qdisc add dev eth0 parent 1:3 handle 3:0 htb default 3
    # Распределение для внешнего трафика по полосам.
    tc class add dev eth0 parent 3:0 classid 3:1 htb rate 120kbps
    tc class add dev eth0 parent 3:1 classid 3:2 htb rate 120kbps prio 1
    tc class add dev eth0 parent 3:1 classid 3:3 htb rate 1kbps ceil 120kbps prio 10
    tc qdisc add dev eth0 parent 3:2 handle 20:0 sfq perturb 10
    tc qdisc add dev eth0 parent 3:3 handle 30:0 sfq perturb 10
    tc filter add dev eth0 parent 3:0 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 3:2
}

case "$1" in
start) echo -n "Starting shaper"
    start_shaper
    echo "."
   ;;
stop) echo -n "Stopping shaper"
    stop_shaper
    echo "."
   ;;
restart)
    echo -n "Restarting shaper"
    stop_shaper
    start_shaper
    echo "."
   ;;
*)  echo "Usage: $0 start|stop|restart"
    exit 1
   ;;
esac
exit 0

Кроме того есть еще один интересный момент. В классе 1:2 у вас rate 1mbit ceil 100mbit . Это значит, что когда классу понадобится скорость выше 1mbit он займет ее у вышестоящего класса. А нам это как раз не надо - скорость у провайдера же не изменится. Ситуацию конечно исправляет класс 3:1 который явно ограничивает 120кБ/с, но все таки как-то нелогично. Я удалил этот ceil(кстати, если он не указан, то считается равным rate).

Также еще кое-что можно улучшить. У вас сейчас делается так:
htb верхнего уровня(1:0) -> htb нижнего уровня(3:0) -> конечная sfq
А можно обойтись только одной htb на верхнем уровне, все остальное реализовав на классах. Станет понятнее, сократится код и возможно будет эффективнее с точки зрения системных ресурсов(хотя тут и так не критично). Если смотреть на вашу графику, то лишняя htb это 3:0. Сам переделывать не рискнул, т к негде тестировать.

distress писал(а):
27.11.2010 01:24
UPD: когда наблюдал за классами - заметил вот это. sfq размножается.

Странно... Вроде я ничего такого не видел. А в какой момент они так размножаются? При запусках/остановках скрипта? Попробуйте отследить откуда ноги растут. Кстати возможно из-за лишней htb, но не уверен.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Alex2ndr писал(а):
27.11.2010 13:06
Кроме того есть еще один интересный момент. В классе 1:2 у вас rate 1mbit ceil 100mbit . Это значит, что когда классу понадобится скорость выше 1mbit он займет ее у вышестоящего класса. А нам это как раз не надо - скорость у провайдера же не изменится.

я а подумал, что именно это и надо. класс для локального трафика - пусть берет хоть всю полосу только бы не мешал интернету. а он и не должен - у него приоритет 10.
Или я что-то глобальное про htb не уловил? Вот эти 3 класса в оригинальном виде.

root@host

tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 100mbit ceil 100mbit tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 1mbit ceil 100mbit prio 10 tc class add dev ifb0 parent 1:1 classid 1:3 htb rate 100mbit ceil 100mbit prio 1


как я это понимаю:
1. Создаю класс 1:1, к которому будут подключаться другие классы. Максимальная скорость, которую он будет отдавать подключенным к нему классам 1:2 и 1:3 - 100mbit (суммарно на всех). ceil не нужен.
2. создаю класс 1:2 подключенный к 1:1 с минимальной скоростью 1mbit, если трафик используется чем-то еще более приоритетным. Mаксимально возможная скорость будет 100мбит т.е. -> если никто кроме этого класса трафик не использует, то он может поднять свою скорость с 1 мбит до 100мбит. этот класс должен уступать классу 1:3 канал в любом количестве если потребуется(т.к. у него приоритет 10.), уменьшая при этом свою скорость до 1мбит.
3. ну и последний класс 1:3 с приоритетом 1. если ему понадобится - он может забрать почти весь канал на себя (кроме того гарантированного 1мбит для класса 1:2.). ceil не нужен.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
27.11.2010 15:36
я а подумал, что именно это и надо. класс для локального трафика - пусть берет хоть всю полосу только бы не мешал интернету. а он и не должен - у него приоритет 10.
Или я что-то глобальное про htb не уловил? Вот эти 3 класса в оригинальном виде.
...
как я это понимаю:
1. Создаю класс 1:1, к которому будут подключаться другие классы. Максимальная скорость, которую он будет отдавать подключенным к нему классам 1:2 и 1:3 - 100mbit (суммарно на всех). ceil не нужен.
2. создаю класс 1:2 подключенный к 1:1 с минимальной скоростью 1mbit, если трафик используется чем-то еще более приоритетным. Mаксимально возможная скорость будет 100мбит т.е. -> если никто кроме этого класса трафик не использует, то он может поднять свою скорость с 1 мбит до 100мбит. этот класс должен уступать классу 1:3 канал в любом количестве если потребуется(т.к. у него приоритет 10.), уменьшая при этом свою скорость до 1мбит.
3. ну и последний класс 1:3 с приоритетом 1. если ему понадобится - он может забрать почти весь канал на себя (кроме того гарантированного 1мбит для класса 1:2.). ceil не нужен.

Понимаете вы все правильно. Возможно это я путаюсь. Но только зачем трафику в интернет( те классу 1:3) скорость в 100мбит? ведь провайдер не даст больше 1 мбит. А если у нас через этот класс будет хотя бы 2 мбит, то получим то, с чего начали - шейпер работает, но не у нас а у провайдера. Сейчас ситуацию исправляет 3:1 который держит ограничение в 120кбайт=1мбит. Поэтому я бы сделал так:

Код: Выделить всё

 tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 100mbit
tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 99mbit ceil 100mbit prio 10
tc class add dev ifb0 parent 1:1 classid 1:3 htb rate 1mbit ceil 1mbit prio 1

Но я честно говорю что могу не представлять/понимать некоторых ваших задач/желаний. Сейчас мы расходимся не в технических деталях а в том как именно формировать поток трафика.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Постарался учесть все замечания. Убрал промежуточный htb, подкрутил rate, откомментировал.

Код: Выделить всё

    # >>> шейпер входящего трафика <<<
    # Корневая полоса, общая для локального и внешнего трафика.
    # Если трафик не попадает ни в один фильтр, то направить его в класс 1:4
    tc qdisc add dev ifb0 root handle 1:0 htb r2q 40 default 4
    tc class add dev ifb0 parent 1:0 classid 1:1 htb quantum 5000 rate 100mbit

    # Полоса для локального трафика
    tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 99mbit ceil 100mbit prio 10 quantum 5000
    tc qdisc add dev ifb0 parent 1:2 handle 10:0 pfifo
    # Весь локальный трафик в эту полосу
    tc filter add dev ifb0 parent 1:0 protocol ip prio 1 u32 match ip src 192.0.0.0/8 flowid 1:2
    tc filter add dev ifb0 parent 1:0 protocol ip prio 2 u32 match ip src 10.0.0.0/8 flowid 1:2
    tc filter add dev ifb0 parent 1:0 protocol ip prio 3 u32 match ip src $MY_ISP_IP_RANGE flowid 1:2

    # Полоса для внешнего трафика
    tc class add dev ifb0 parent 1:1 classid 1:3 htb rate 1mbit prio 1 quantum 5000
    # Распределение для внешнего трафика по полосам.
    # Полоса для трафика с высоким приоритетом (гарантирована максимальная скорость и приоритет 1)
    tc class add dev ifb0 parent 1:3 classid 1:5 htb rate 119kbps ceil 120kbps prio 1 quantum 5000
    tc qdisc add dev ifb0 parent 1:5 handle 50:0 sfq perturb 1
    # ssh в полосу с высоким приоритетом
    tc filter add dev ifb0 parent 1:0 protocol ip prio  0 u32 match ip sport 22 0xffff flowid 1:5
    # Полоса для трафика с низким приоритетом - всё остальное, что не попало в полосы
    # локального трафика или трафика с высоким приоритетом (возможна максимальная скорость только
    # если канал свободен + пониженный приоритет 10.)
    tc class add dev ifb0 parent 1:3 classid 1:4 htb rate 1kbps ceil 120kbps prio 10 quantum 5000
    tc qdisc add dev ifb0 parent 1:4 handle 40:0 sfq perturb 10

некоторые наблюдения:
1. sfq размножается пропорционально соединениям. примерно 1 sfq класс на 2 соединения. Наверное так и надо, но подумываю заменить на pfifo
2. Ядро ругается на слишком большой/маленький quantum - проставил где просит.
3. Большое количество закачек торрента с большим количеством соединений в них таки забивает входящий канал и, чтобы всё перестало тормозить, приходится уменьшать ceil для неприоритетного трафика. или остановить определенное число закачек. в результате торрент качает с той же скоростью но ssh становятся интерактивными, а не пошаговыми.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
27.11.2010 22:52
1. sfq размножается пропорционально соединениям. примерно 1 sfq класс на 2 соединения. Наверное так и надо, но подумываю заменить на pfifo

Что-то я не совсем понимаю о каких классах sfq идет речь. У меня sfq это концевые дисциплины(т е очереди) и самостоятельно они не размоножаются. У меня конечно ifb нету, только imq, но не думаю что это имеет большое значение. Смотрю вывод tc -s class show dev imq0 и вижу только htb классы(sfq безклассовая дисциплина и директивой class не показывается). Смотрю tc -s qdisc show dev imq0 и вижу корневую htb и концевые sfq, но только те, что сам создавал. Поэтому пока ваша проблема мной не понята. Давайте подробнее что делаете и что видите. Попробую повторить.

distress писал(а):
27.11.2010 22:52
3. Большое количество закачек торрента с большим количеством соединений в них таки забивает входящий канал и, чтобы всё перестало тормозить, приходится уменьшать ceil для неприоритетного трафика. или остановить определенное число закачек. в результате торрент качает с той же скоростью но ssh становятся интерактивными, а не пошаговыми.

Вероятно что скорость полосы в интернет надо ограничить до значения Тариф_провайдера минус 10-15%. Рекомендуется во всех статьях по шейпингу. Это позволит компенсировать пики загрузки. Также мой соавтор(Евгений) жаловался, что из-за торрента через udp приходится уменьшать аж на 30%. Вы поиграйте с этим значением при полной занятости канала торрентом.

В остальном вроде все в порядке.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

Alex2ndr писал(а):
27.11.2010 23:48
Что-то я не совсем понимаю о каких классах sfq идет речь. У меня sfq это концевые дисциплины(т е очереди) и самостоятельно они не размоножаются. У меня конечно ifb нету, только imq, но не думаю что это имеет большое значение. Смотрю вывод tc -s class show dev imq0 и вижу только htb классы(sfq безклассовая дисциплина и директивой class не показывается). Смотрю tc -s qdisc show dev imq0 и вижу корневую htb и концевые sfq, но только те, что сам создавал. Поэтому пока ваша проблема мной не понята. Давайте подробнее что делаете и что видите. Попробую повторить.

Вот полный вывод
Классы:

Код: Выделить всё

# tc -s class show dev ifb0
class htb 1:1 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 1435133264 bytes 1299986 pkt (dropped 0, overlimits 0 requeues 0)
 rate 965632bit 134pps backlog 0b 0p requeues 0
 lended: 733 borrowed: 0 giants: 0
 tokens: 110 ctokens: 110

class htb 1:2 parent 1:1 leaf 10: prio 7 rate 99000Kbit ceil 100000Kbit burst 1584b cburst 1600b
 Sent 697998717 bytes 477401 pkt (dropped 0, overlimits 0 requeues 0)
 rate 1704bit 2pps backlog 0b 0p requeues 0
 lended: 476668 borrowed: 733 giants: 0
 tokens: 1937 ctokens: 1922

class htb 1:3 parent 1:1 rate 1000Kbit ceil 1000Kbit burst 1600b cburst 1600b
 Sent 737134547 bytes 822585 pkt (dropped 0, overlimits 0 requeues 0)
 rate 963928bit 133pps backlog 0b 0p requeues 0
 lended: 776246 borrowed: 0 giants: 0
 tokens: 10000 ctokens: 10000

class htb 1:4 parent 1:3 leaf 40: prio 7 rate 8000bit ceil 960000bit burst 1600b cburst 1599b
 Sent 688123979 bytes 783559 pkt (dropped 73271, overlimits 0 requeues 0)
 rate 954896bit 132pps backlog 0b 127p requeues 0
 lended: 7411 borrowed: 776021 giants: 0
 tokens: -18687248 ctokens: -197804

class htb 1:5 parent 1:3 leaf 50: prio 1 rate 952000bit ceil 960000bit burst 1599b cburst 1599b
 Sent 49135469 bytes 39153 pkt (dropped 0, overlimits 0 requeues 0)
 rate 10352bit 1pps backlog 0b 0p requeues 0
 lended: 38928 borrowed: 225 giants: 0
 tokens: 178578 ctokens: 177094

class sfq 40:8 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot 30505

class sfq 40:18 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -26528

class sfq 40:2e parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -6217

class sfq 40:48 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -30402

class sfq 40:53 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -31635

class sfq 40:72 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 4p requeues 0
 allot -30438

class sfq 40:79 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -5419

class sfq 40:8a parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 3p requeues 0
 allot -22385

class sfq 40:8b parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -18246

class sfq 40:93 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 6949

class sfq 40:97 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -7256

class sfq 40:ad parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 4815

class sfq 40:ae parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -30079

class sfq 40:d1 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -3686

class sfq 40:d8 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 3p requeues 0
 allot -3258

class sfq 40:dd parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 17036

class sfq 40:f8 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 18659

class sfq 40:fb parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 25438

class sfq 40:fd parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 23915

class sfq 40:100 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 409

class sfq 40:118 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -3514

class sfq 40:119 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -29564

class sfq 40:11d parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 5140

class sfq 40:128 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -5193

class sfq 40:147 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 6010

class sfq 40:153 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -22458

class sfq 40:158 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 3p requeues 0
 allot -2935

class sfq 40:165 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 16922

class sfq 40:19a parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 22816

class sfq 40:1b5 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -15383

class sfq 40:1bd parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 26709

class sfq 40:1d7 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 14176

class sfq 40:1ef parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -19192

class sfq 40:1fb parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 3p requeues 0
 allot 24431

class sfq 40:203 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -29111

class sfq 40:219 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 4p requeues 0
 allot -17010

class sfq 40:227 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -19774

class sfq 40:22e parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 26305

class sfq 40:233 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 4452

class sfq 40:23b parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot 10561

class sfq 40:253 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 3p requeues 0
 allot 19413

class sfq 40:267 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -20089

class sfq 40:284 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -6473

class sfq 40:289 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -8209

class sfq 40:28c parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 5p requeues 0
 allot 32722

class sfq 40:29f parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -2265

class sfq 40:2ae parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 4p requeues 0
 allot 15742

class sfq 40:2c2 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -28843

class sfq 40:2ea parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -25464

class sfq 40:2f8 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 6847

class sfq 40:2fa parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 3p requeues 0
 allot 356

class sfq 40:305 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 6997

class sfq 40:31d parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 23700

class sfq 40:321 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -20620

class sfq 40:329 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 8358

class sfq 40:32f parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -16139

class sfq 40:335 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot 10177

class sfq 40:337 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 13586

class sfq 40:33a parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot 12601

class sfq 40:33c parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 4p requeues 0
 allot -62

class sfq 40:343 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 22081

class sfq 40:348 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 2p requeues 0
 allot -31231

class sfq 40:34f parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -8530

class sfq 40:356 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -5323

class sfq 40:361 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 10610

class sfq 40:369 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 7478

class sfq 40:371 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -27884

class sfq 40:387 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -19697

class sfq 40:398 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 6918

class sfq 40:39a parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -10954

class sfq 40:39f parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 24597

class sfq 40:3a4 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -28963

class sfq 40:3b3 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 5p requeues 0
 allot -8574

class sfq 40:3bc parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 9868

class sfq 40:3be parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 28196

class sfq 40:3bf parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot 24176

class sfq 40:3c2 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -6709

class sfq 40:3d6 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -29632

class sfq 40:3e2 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 1p requeues 0
 allot -25671

class sfq 40:400 parent 40:
 (dropped 0, overlimits 0 requeues 0)
 backlog 0b 4p requeues 0
 allot -7653


Дисциплины:

Код: Выделить всё

# tc -s qdisc show dev ifb0
qdisc htb 1: root refcnt 2 r2q 40 default 4 direct_packets_stat 0
 Sent 1500239454 bytes 1372567 pkt (dropped 80163, overlimits 2730493 requeues 0)
 backlog 0b 119p requeues 0
qdisc pfifo 10: parent 1:2 limit 32p
 Sent 698043000 bytes 477778 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc sfq 50: parent 1:5 limit 127p quantum 1514b perturb 1sec
 Sent 49987014 bytes 40035 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc sfq 40: parent 1:4 limit 127p quantum 1514b perturb 10sec
 Sent 752209440 bytes 854754 pkt (dropped 80163, overlimits 0 requeues 0)
 backlog 106634b 119p requeues 0


Alex2ndr писал(а):
27.11.2010 23:48
Вероятно что скорость полосы в интернет надо ограничить до значения Тариф_провайдера минус 10-15%. Рекомендуется во всех статьях по шейпингу. Это позволит компенсировать пики загрузки. Также мой соавтор(Евгений) жаловался, что из-за торрента через udp приходится уменьшать аж на 30%. Вы поиграйте с этим значением при полной занятости канала торрентом.

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

у меня получилось примерно 20%. udp в клиенте я отключил - читал много противоречивых отзывов, попробовал выключить - разницы не заметил. Так и оставил выключенным на всякий случай.
Спасибо сказали:
Аватара пользователя
Alex2ndr
Сообщения: 443
ОС: Debian Lenny

Re: [РЕШЕНО] tc, ssh

Сообщение Alex2ndr »

distress писал(а):
28.11.2010 00:51
Вот полный вывод
Классы:
....

Это странно, но у меня ничего такого нету. Вот как ваш старый вариант выглядит на моем буке:

Код: Выделить всё

alex@notebook:~/development$ tc -s class show dev ifb0
class htb 1:1 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 70292 bytes 239 pkt (dropped 0, overlimits 0 requeues 0)
 rate 3240bit 2pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 1704 ctokens: 1704

class htb 1:2 parent 1:1 leaf 10: prio 7 rate 1000Kbit ceil 1000Kbit burst 1600b cburst 1600b
 Sent 21894 bytes 93 pkt (dropped 0, overlimits 0 requeues 0)
 rate 1880bit 1pps backlog 0b 0p requeues 0
 lended: 93 borrowed: 0 giants: 0
 tokens: 170000 ctokens: 170000

class htb 1:3 parent 1:1 leaf 3: prio 1 rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 48398 bytes 146 pkt (dropped 0, overlimits 0 requeues 0)
 rate 1360bit 1pps backlog 0b 0p requeues 0
 lended: 146 borrowed: 0 giants: 0
 tokens: 1875 ctokens: 1875

class htb 3:1 root rate 960000bit ceil 960000bit burst 1599b cburst 1599b
 Sent 48398 bytes 146 pkt (dropped 0, overlimits 0 requeues 0)
 rate 1360bit 1pps backlog 0b 0p requeues 0
 lended: 28 borrowed: 0 giants: 0
 tokens: 194797 ctokens: 194797

class htb 3:2 parent 3:1 leaf 20: prio 1 rate 960000bit ceil 960000bit burst 1599b cburst 1599b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 208328 ctokens: 208328

class htb 3:3 parent 3:1 leaf 30: prio 7 rate 8000bit ceil 960000bit burst 1600b cburst 1599b
 Sent 48398 bytes 146 pkt (dropped 0, overlimits 0 requeues 0)
 rate 1360bit 1pps backlog 0b 0p requeues 0
 lended: 118 borrowed: 28 giants: 0
 tokens: 23375000 ctokens: 194797

alex@notebook:~/development$

Как видите никаких sfq классов.
У меня тут Debian GNU/Linux Squeeze стоит. На Lenny тоже ничего такого не вижу. Может это особенности RHEL? У Евгения Fedora и CentOS и тоже ничего такого нету.
Спасибо сказали:
distress
Сообщения: 84
ОС: RHEL5

Re: [РЕШЕНО] tc, ssh

Сообщение distress »

собрал всё в кучу, как мог неделю потестировал... финальный скрипт получился примерно таким:

Код: Выделить всё

#!/bin/bash

# >>>конфиг<<<

# диапазон внешних IP адресов провайдера (к ним не будет применено ограничение скорости)
MY_ISP_IP_RANGE="193.1.0.0/24";
# скорость приема по тарифу провайдера, килобайт/с
limitIN="128";
# скорость отдачи по тарифу провайдера, килобайт/с
limitOUT="128";

# >>>дальше нет конфига<<<

stop_shaper()
{
    tc qdisc del dev eth0 root &> /dev/null
    tc qdisc del dev eth0 ingress &> /dev/null
    tc qdisc del dev ifb0 root &> /dev/null
    tc qdisc del dev ifb0 ingress &> /dev/null
    ip link set ifb0 down
    rmmod ifb &> /dev/null
}

start_shaper()
{

    # >>> шейпер входящего трафика <<<

    # ограничить максимальную скорость входящих соединений на ~20%
    let limitIN=limitIN-limitIN/5;

    # подгрузить модуль ядра, необходимый для использования ifb
    modprobe ifb
    # поднять ifb0
    ip link set ifb0 up

    # Перенаправить все IP пакеты, приходящие в eth0, на ifb0
    tc qdisc add dev eth0 handle ffff: ingress
    tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

    # Корневая полоса, общая для локального и внешнего трафика.
    # Если трафик не попадает ни в один фильтр, то направить его в класс 1:4
    tc qdisc add dev ifb0 root handle 1:0 htb r2q 40 default 4
    tc class add dev ifb0 parent 1:0 classid 1:1 htb quantum 5000 rate 100mbit

    # Полоса для локального трафика
    tc class add dev ifb0 parent 1:1 classid 1:2 htb rate 99mbit ceil 100mbit prio 10 quantum 5000
    tc qdisc add dev ifb0 parent 1:2 handle 10:0 pfifo
    # Весь локальный трафик в эту полосу
    tc filter add dev ifb0 parent 1:0 protocol ip prio 1 u32 match ip src 192.0.0.0/8 flowid 1:2
    tc filter add dev ifb0 parent 1:0 protocol ip prio 2 u32 match ip src 10.0.0.0/8 flowid 1:2
    tc filter add dev ifb0 parent 1:0 protocol ip prio 3 u32 match ip src $MY_ISP_IP_RANGE flowid 1:2

    # Полоса для внешнего трафика
    tc class add dev ifb0 parent 1:1 classid 1:3 htb rate ${limitIN}kbps prio 1 quantum 5000
    # Распределение для внешнего трафика по полосам.
    # Полоса для трафика с высоким приоритетом (гарантирована максимальная скорость и приоритет 1)
    tc class add dev ifb0 parent 1:3 classid 1:5 htb rate ${limitIN}kbps ceil ${limitIN}kbps prio 1 quantum 5000
    tc qdisc add dev ifb0 parent 1:5 handle 50:0 sfq perturb 1
    # ssh в полосу с высоким приоритетом
    tc filter add dev ifb0 parent 1:0 protocol ip prio  0 u32 match ip sport 22 0xffff flowid 1:5
    # Полоса для трафика с низким приоритетом - всё остальное, что не попало в полосы
    # локального трафика или трафика с высоким приоритетом (возможна максимальная скорость только
    # если канал свободен + пониженный приоритет 10.)
    tc class add dev ifb0 parent 1:3 classid 1:4 htb rate 1kbps ceil ${limitIN}kbps prio 10 quantum 5000
    tc qdisc add dev ifb0 parent 1:4 handle 40:0 sfq perturb 10








    # >>> шейпер исходящего трафика <<<
    # ограничить максимальную скорость исходящих соединений на ~20%
    let limitOUT=limitOUT-limitOUT/5;
    # Корневая полоса, общая для локального и внешнего трафика.
    # Если трафик не попадает ни в один фильтр, то направить его в класс 1:4
    tc qdisc add dev eth0 root handle 1:0 htb r2q 40 default 4
    tc class add dev eth0 parent 1:0 classid 1:1 htb quantum 5000 rate 100mbit

    # Полоса для локального трафика
    tc class add dev eth0 parent 1:1 classid 1:2 htb rate 99mbit ceil 100mbit prio 10 quantum 5000
    tc qdisc add dev eth0 parent 1:2 handle 10:0 pfifo
    # Весь локальный трафик в эту полосу
    tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 192.0.0.0/8 flowid 1:2
    tc filter add dev eth0 parent 1:0 protocol ip prio 2 u32 match ip dst 10.0.0.0/8 flowid 1:2
    tc filter add dev eth0 parent 1:0 protocol ip prio 3 u32 match ip dst $MY_ISP_IP_RANGE flowid 1:2

    # Полоса для внешнего трафика
    tc class add dev eth0 parent 1:1 classid 1:3 htb rate ${limitOUT}kbps prio 1 quantum 5000
    # Распределение для внешнего трафика по полосам.
    # Полоса для трафика с высоким приоритетом (гарантирована максимальная скорость и приоритет 1)
    tc class add dev eth0 parent 1:3 classid 1:5 htb rate ${limitOUT}kbps ceil ${limitOUT}kbps prio 1 quantum 5000
    tc qdisc add dev eth0 parent 1:5 handle 50:0 sfq perturb 1
    # ssh в полосу с высоким приоритетом
    tc filter add dev eth0 parent 1:0 protocol ip prio  0 u32 match ip dport 22 0xffff flowid 1:5
    # Полоса для трафика с низким приоритетом - всё остальное, что не попало в полосы
    # локального трафика или трафика с высоким приоритетом (возможна максимальная скорость только
    # если канал свободен + пониженный приоритет 10.)
    tc class add dev eth0 parent 1:3 classid 1:4 htb rate 1kbps ceil ${limitOUT}kbps prio 10 quantum 5000
    tc qdisc add dev eth0 parent 1:4 handle 40:0 sfq perturb 10
}



case "$1" in
start) echo -n "Starting shaper"
    start_shaper
    echo "."
;;
stop) echo -n "Stopping shaper"
    stop_shaper
    echo "."
;;
restart)
    echo -n "Restarting shaper"
    stop_shaper
    start_shaper
    echo "."
;;
*)  echo "Usage: $0 start|stop|restart"
    exit 1
;;
esac
exit 0

замечания по использованию:
1. sfq классы появляются и исчезают - зависит от количества соединений. можно сменить на pfifo, разницы не заметил.
2. при большой количестве соединений торрента интернет канал забивается даже с шейпером - поставил с запасом ограничение 20% от максимальной скорости по тарифу.
Спасибо сказали:
Ответить