Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » Не работает QoS в Linux

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

SysCommander

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пытаюсь настроить приоритизацию трафика в 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
 

 
Вот что показывает статус:

Код:
 
$ sudo /usr/sbin/tc -s qdisc show
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default 0 direct_packets_stat 77382
 Sent 75917415 bytes 77382 pkt (dropped 0, overlimits 0 requeues 0)  
 backlog 0b 0p requeues 0  
qdisc sfq 10: dev eth0 parent 1:10 limit 127p quantum 1514b perturb 10sec  
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)  
 backlog 0b 0p requeues 0  
qdisc sfq 20: dev eth0 parent 1:20 limit 127p quantum 1514b perturb 10sec  
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)  
 backlog 0b 0p requeues 0
 

 
Смотрел этот HOWTO: http://www.andybev.com/index.php/Fair_traffic_shaping_an_ADSL_line_for_a_local_network_using_Linux
 
Почему не работает, почему счетчики по нулям?

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 09:57 03-09-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Могу лишь дать ссылку где в принципе обо всех подобных вещах все довольно хорошо написано....
http://www.opennet.ru/docs/RUS/LARTC/LARTC-net.html.gz

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 20:04 03-09-2010
SysCommander

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 22:08 03-09-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, это просто русский перевод, и об этом там написано...
 
После внимательного прочтения тамешнего примера могу заметить разницу у вас с ним...
1 - там пакеты в iptables маркируются шестнадцатиричными значениями, а у вас нет. Хотя в man по iptables об этом не слово, однако в примерах man есть примеры с 16-ой системой...
2 - в примере наблюдается следование classid 1:10, а у вас flowid 1:10...
 
Так же не понятна логика в отношении 12222 порта - но это уже ваши мысли...
 
p.s. а вот у меня всё руки не доходят поиграться с QoS ...
p.p.s. сравнивал я с примером не по вашей ссылке -- кстати по вашему HOWTO есть не понятная мне запись о flowid - типа "для примера мы используем маркировку трафика (называемую flowid здесь)"...

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 01:06 04-09-2010 | Исправлено: Alukardd, 01:16 04-09-2010
SysCommander

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Перечитал 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
 

 
Что касается 12222 порта: моя главная задача - разделить UDP и TCP, дать UDP повышенный приоритет, потому что FPS игры идут через него. С другой стороны, через 12222-й порт UDP у меня идет DHT для bittorrent, которому повышенный приоритет не нужен, и таким дополнительным условием в правиле я его отсекаю. В целом, согласен, это можно будет сделать и позже. Пусть для чистоты эксперимента этого ограничения не будет. Таким образом правила iptables упрощаются до:
     

Код:
 
# all traffic coming in on eth0 with the default 20
$IPTABLES -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 20
# udp - mark as 10
$IPTABLES -t mangle -A PREROUTING -i eth0 -p udp -j MARK --set-mark 10
 

 
Посмотрел еще раз правила iptables в примере по ссылке. Никаких шестнадцатеричных значений я там не увидел. Да, iptables -L выводит маркеры в шестнадцатеричном представлении, ну и что? 0xa == 10, 0x14 == 20
 

Код:
 
$ sudo /usr/sbin/iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination          
MARK       all  --  anywhere             anywhere            MARK set 0x14  
MARK       udp  --  anywhere             anywhere            MARK set 0xa  
 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination          
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination          
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination          
 
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
 

 
Но какая тут связь мне непонятно.
 
Правила фильтрации у меня точно такие как в примере. Контрольная первая строчка в примере:
     

Код:
 
tc filter add dev eth0 parent 1:0 protocol ip handle 10 fw flowid 1:10
 

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

Код:
 
#!/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)
#   * 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 PREROUTING -i eth0 -p udp -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
 

 
А результат тот же:
     

Код:
 
$ sudo /usr/sbin/tc -s qdisc show
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default 0 direct_packets_stat 3439
 Sent 4099401 bytes 3439 pkt (dropped 0, overlimits 0 requeues 0)  
 backlog 0b 0p requeues 0  
qdisc sfq 10: dev eth0 parent 1:10 limit 127p quantum 1514b perturb 10sec  
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)  
 backlog 0b 0p requeues 0  
qdisc sfq 20: dev eth0 parent 1:20 limit 127p quantum 1514b perturb 10sec  
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)  
 backlog 0b 0p requeues 0
 

 
Все опять по нулям и опять уперлось в  "ЧЯДНТ".

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 07:33 04-09-2010 | Исправлено: SysCommander, 07:35 04-09-2010
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну во первых я писал, что прочитал пример который по вашей ссылке и по моей, и замечания все что написал делал по МОЕЙ ссылке...
 
Теперь объясню мои непонятки по поводу 16-ой системы - дело в том что они(iptables и tc) по умолчанию могут работать с разными системами(10 и 16) и получается что десятка в правилах iptables и десятка в tc оказываются разными числами! - это только предположение!
 
И как я пиал выше в примере с opennet при фильтрации используется критерий classid, а не flowid как у вас.
 
p.s. Думаю вы ни чего не теряете, если попробуете сделать то, что я сказал - даже если это кажется бредом...

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:59 04-09-2010
SysCommander

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сменил id в правилах на однозначные, чтобы не сказывалась предполагаемая (возможно) разница.
Сменил везде, и в правилах iptables и в правилах tc.
Сменил flowid на classid в правилах.
Ничего не изменилось.

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 16:12 04-09-2010
vjunk

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SysCommander
Ты маркируешь входящие через интерфейс eth0 пакеты, а шейпинг работает только с исходящими (устроен от так).
Входящие пакеты теоретически можно шейпить через IMQ, но это гораздо более тёмная история, чем обычный шейпинг исходящих пакетов.

Всего записей: 303 | Зарегистр. 23-02-2005 | Отправлено: 00:06 16-09-2010
SysCommander

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 421 | Зарегистр. 20-07-2007 | Отправлено: 07:39 16-09-2010
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Операционные системы » UNIX » Не работает QoS в Linux


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru