Ru-Board.club
← Вернуться в раздел «UNIX»

» Не работает QoS в Linux

Автор: SysCommander
Дата сообщения: 03.09.2010 08:57
Пытаюсь настроить приоритизацию трафика в Linux, чтобы не лагали FPS игры.
Хочу повысить приоритет всего UDP трафика, за исключением одного порта.
Есть такой скрипт:


Код:
#!/bin/bash

IPTABLES=/usr/sbin/iptables
TC=/usr/sbin/tc

# All traffic is given an iptables MARK depending on its type:
# * 10 for low latency traffic (all UDP traffic except the one
# originating from port 12222)
# * 20 anything else

# all traffic coming in on eth0 with the default 20
$IPTABLES -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 20
# udp except port 12222 - mark as 10
$IPTABLES -t mangle -A FORWARD -i eth0 -p udp ! --sport 12222 -j MARK --set-mark 10

# root qdisc
$TC qdisc add dev eth0 root handle 1: htb
# overall rate limits (1Mbps outgoing)
$TC class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit
# interactive UDP
$TC class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 512kbit prio 0
# everything else
$TC class add dev eth0 parent 1:1 classid 1:20 htb rate 512kbit ceil 512kbit prio 1

# do fair shaping in each class
$TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

# divert traffic marked by iptables into each class
$TC filter add dev eth0 parent 1:0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev eth0 parent 1:0 protocol ip handle 20 fw flowid 1:20
Автор: Alukardd
Дата сообщения: 03.09.2010 19:04
Могу лишь дать ссылку где в принципе обо всех подобных вещах все довольно хорошо написано....
http://www.opennet.ru/docs/RUS/LARTC/LARTC-net.html.gz
Автор: SysCommander
Дата сообщения: 03.09.2010 21:08

Цитата:
Могу лишь дать ссылку


Это похоже на русский перевод доки с lartc.org, у меня и с оригиналом на английском никаких трудностей нет. У меня проблема вида "почему не работает как я сделал, ЧЯДНТ". Из-за отсутствия опыта с этим, мне нужен или пинок в нужное направление со стороны знающего человека, или же везение, чтобы я нашел ответ на очень частный вопрос в процессе многоразового повторного тыкания в доки, чем я и занимаюсь

В частности, мне может помочь ссылка на какую-нибудь книгу по сабжу, где очень подробно и наглядно разжеван процесс дебаггинга приоритизации траффика (если такая книга вообще существует). Потому что сейчас у меня вроде бы есть настроенный шейпинг, iptables -L тоже показывает правила маркировки пакетов, но работать не работает и я не знаю почему, так как делаю это впервые.
Автор: Alukardd
Дата сообщения: 04.09.2010 00:06
Да, это просто русский перевод, и об этом там написано...

После внимательного прочтения тамешнего примера могу заметить разницу у вас с ним...
1 - там пакеты в iptables маркируются шестнадцатиричными значениями, а у вас нет. Хотя в man по iptables об этом не слово, однако в примерах man есть примеры с 16-ой системой...
2 - в примере наблюдается следование classid 1:10, а у вас flowid 1:10...

Так же не понятна логика в отношении 12222 порта - но это уже ваши мысли...

p.s. а вот у меня всё руки не доходят поиграться с QoS ...
p.p.s. сравнивал я с примером не по вашей ссылке -- кстати по вашему HOWTO есть не понятная мне запись о flowid - типа "для примера мы используем маркировку трафика (называемую flowid здесь)"...
Автор: SysCommander
Дата сообщения: 04.09.2010 06:33
Перечитал HOWTO по ссылке еще раз. Там речь идет о двух сетевых интерфейсах, между которыми NAT, потому используется FORWARD chain. У меня этого нет. Таким образом правила iptables у меня превратились в:


Код:
# all traffic coming in on eth0 with the default 20
$IPTABLES -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 20
# udp except port 12222 - mark as 10
$IPTABLES -t mangle -A PREROUTING -i eth0 -p udp ! --sport 12222 -j MARK --set-mark 10
Автор: Alukardd
Дата сообщения: 04.09.2010 13:59
Ну во первых я писал, что прочитал пример который по вашей ссылке и по моей, и замечания все что написал делал по МОЕЙ ссылке...

Теперь объясню мои непонятки по поводу 16-ой системы - дело в том что они(iptables и tc) по умолчанию могут работать с разными системами(10 и 16) и получается что десятка в правилах iptables и десятка в tc оказываются разными числами! - это только предположение!

И как я пиал выше в примере с opennet при фильтрации используется критерий classid, а не flowid как у вас.

p.s. Думаю вы ни чего не теряете, если попробуете сделать то, что я сказал - даже если это кажется бредом...
Автор: SysCommander
Дата сообщения: 04.09.2010 15:12
Сменил id в правилах на однозначные, чтобы не сказывалась предполагаемая (возможно) разница.
Сменил везде, и в правилах iptables и в правилах tc.
Сменил flowid на classid в правилах.
Ничего не изменилось.
Автор: vjunk
Дата сообщения: 15.09.2010 23:06
SysCommander
Ты маркируешь входящие через интерфейс eth0 пакеты, а шейпинг работает только с исходящими (устроен от так).
Входящие пакеты теоретически можно шейпить через IMQ, но это гораздо более тёмная история, чем обычный шейпинг исходящих пакетов.
Автор: SysCommander
Дата сообщения: 16.09.2010 06:39

Цитата:
Ты маркируешь входящие через интерфейс eth0 пакеты


точно, вот оно же!

Поменял в правилах iptables на "-A POSTROUTING -o eth0" и счетчики сразу начали считать пакеты.

Теперь остается один вопрос: как же увидеть наглядно что пакеты с более высоким приоритетом действительно уходят первыми? Есть какие-то утилиты для этого, или это умеет сам tc показывать? Я себе это представляю так: лог куда пишутся события, связанные с отдельными пакетами. Один timestamp - когда пакет попадает в очередь на отправку. Еще один - когда пакет непосредственно отправляется. Исходящий канал я смогу без проблем нагрузить до упора трафиком с меньшим приоритетом. В таком случае если я увижу что пакеты с большим приоритетом попадают в очередь для отправки позже, а отправляются первыми - это меня вполне убедит что я все делаю правильно.

Страницы: 1

Предыдущая тема: Помогите с установкой qbitTorrent в CentOs


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.