LINUX.ORG.RU
ФорумAdmin

Что не так у меня с TC shaper

 ,


0

1

в свое время написал такой скрип в надежде что будет выполняться задача по ограничению трафика таким образом, чтобы не «зажимало» телефонию, но хоть и указана скорость ниже пропускной способности, но как то получается, что на интерфейсе (внешнем) вижу скорость в 2 раза выше в пиках (есть как транзитный трафик, так и трафик локальных процессов)

$ sudo cat /etc/init.d/tc
#!/bin/bash

### BEGIN INIT INFO
# Provides:          tc
# Required-Start:    $network
# Required-Stop:     $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: TC SHAPER
# Description:       TC SHAPER
### END INIT INFO

DEV=eth0.41
RATE=9500kbit

status() {
    echo
    tc -s qdisc ls dev $DEV
    echo
    tc -s class ls dev $DEV
    exit
}

monitor() {
    watch tc -s -d class show dev $DEV
}

start() {
    tc qdisc add dev $DEV root handle 1: htb default 20

    tc class add dev $DEV parent 1: classid 1:1 htb rate $RATE

    tc class add dev $DEV parent 1:1 classid 1:10 htb rate 2mbit ceil 3mbit prio 10
    tc class add dev $DEV parent 1:1 classid 1:20 htb rate 2mbit ceil $RATE prio 20

    tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
    tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10

    U32="tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip protocol 0x11 0xff"
    $U32 match ip tos 0x68 0xff flowid 1:10
    $U32 match ip tos 0xb8 0xff flowid 1:10
}

stop() {
    tc qdisc del dev $DEV root
}

case "$1" in
status)
    status
    ;;
monitor)
    monitor
    ;;
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    stop
    start
    ;;
*)
    echo "Usage: $0 {start|stop|restart|status|monitor}"
    exit 1
esac

добавить в фильтр только ип сервера телефонии не могу, т.к. с него периодически тоже бывает служебный трафик, который так же должен «зажиматься»

★★★

главное что не могу понять - указано же общее ограничение в 9.500кбит, а на интерфейсе вижу пики до 20 мбит (столько провайдер и предоставляет)

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

и еще особенность - исходящий трафик (голос) слышно, а вот входящий заикается

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

Своим скриптом ты шейпишь явно только исходящий трафик. Для того, чтобы пользователи внутри сети не сажали тебе внешний канал при закачках нужно вешать ingress шэйпинг на внешний интерфейс и просить его дропать пакеты при превышении лимита. TCP-протоколы это вполне переживают и у юзера просто снижается скорость закачки. Например так:

DOWNLINK=25000
DEV=eth1

tc qdisc add dev $DEV handle ffff: ingress

tc filter add dev $DEV parent ffff: protocol ip prio 50 \
           u32 match ip src 0.0.0.0/0 \
           match ip protocol 6 0xff \
           match ip sport 80 0xffff \
           police rate $((8*${DOWNLINK}/10))kbit \
           burst 10k drop flowid :1

tc filter add dev $DEV parent ffff: protocol ip prio 50 \
           u32 match ip src 0.0.0.0/0 \
           match ip protocol 6 0xff \
           match ip dport 80 0xffff \
           police rate $((8*${DOWNLINK}/10))kbit \
           burst 10k drop flowid :1

Где eth1 — внешний интерфейс сервера реализующего nat для внутренней сети.

BOOBLIK ★★★
()
Последнее исправление: BOOBLIK (всего исправлений: 1)
Ответ на: комментарий от BOOBLIK

BOOBLIK

спасибо
а возможно объединить ограничение исходящего и входящего трафика?
в вашем примере tc filter 2 раза одно и тоже или я ошибаюсь?

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

Можно конечно, я брал готовый скрипт и допиливал уже его под себя. Делалось как раз для выделения гарантированного кусочка канала под телефонию как бы пользователи не извращались с download и upload каналами.

В одном sport в другом dport.

BOOBLIK ★★★
()
Ответ на: комментарий от BOOBLIK

не подскажите еще тогда вопрос - а как выглядит написание в фильтре всего трафика, который не

U32="tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip protocol 0x11 0xff"
    $U32 match ip tos 0x68 0xff flowid 1:10
    $U32 match ip tos 0xb8 0xff flowid 1:10
потому как и ip серверов разные телефонии и диапазон портов с маской насколько я помню криво указывается для asterisk

wolverin ★★★
() автор топика
Ответ на: комментарий от Pinkbyte

Pinkbyte

если не сложно, так должно выглядеть?

iptables -t mangle -A PREROUTING -m tos ! --tos 0x68/0xff -j MARK --set-xmark 0x1/0xffffffff
iptables -t mangle -A PREROUTING -m tos ! --tos 0xb8/0xff -j MARK --set-xmark 0x1/0xffffffff
и добавить в конец моего скрипта 2 строки
tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match mark 0x1 0xffffffff police rate $RATE burst 10k drop flowid :1

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 1)
Ответ на: комментарий от wolverin

--set-xmark

зачем усложнять? просто --set-mark 0x1

В целом да, как-то так. Только убедись предварительно что DSCP/TOS реально проставляется в пакеты с помощью tcpdump-а

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

У prio диапазон 0-7. У тебя в classid 1:10 и 1:20 прописано prio 10 и prio 20. Так реално приоритет не работает по моему.

john33
()
Ответ на: комментарий от john33

john33

я так понял диапазон у прио вообще любой ставится, типа это вес цепочки

Pinkbyte

спасибо, проверю, xmark это iptables-save почему то показывает

wolverin ★★★
() автор топика
Ответ на: комментарий от Pinkbyte

Только убедись предварительно что DSCP/TOS реально проставляется в пакеты с помощью tcpdump-а

tcpdump -nni eth0.41 -v 'ip[1] & 0xfc == 0xb8'

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

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

Если канал у тебя 20mbit почему огр. на 9500? Лучше задай ~80% т.е 16000kbit. Потом в класы общее rate 1:10 и 1:20 == 16000. И не ограничивай ceil на твой приоритетный клас 1:10.

На входящий можно попробовать сделать приоритеты с ifb интерфейс.

http://www.opennet.ru/base/net/htb_saga.txt.html Здесь прочитал про prio 0-7.

john33
()
Ответ на: комментарий от john33

9500 просто для тестирования, общее рейт там около 12 Мбит, цеил это же до скольки может вырасти, по вашей же ссылке указано что если цейл нет, то рейт=сейл, про прио странно, вроде как статистика то показывается по классам

wolverin ★★★
() автор топика
Ответ на: комментарий от john33

На входящий можно попробовать сделать приоритеты с ifb интерфейс.

можно поподробней о чем речь?

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

осталось разобраться ставятся ли марки

перезагрузи файрвол и смотри выхлоп

iptables -vn -t mangle -L

Если счётчик пакетов на правилах mark растёт - значит они маркируются

То же самое с tc - у него есть ключик -s, смотреть «rule hit» для твоих правил

Pinkbyte ★★★★★
()
Ответ на: комментарий от wolverin

про ifb вот что у меня в архиве:

1. Подключаем модуль ядра для ifb modprobe ifb

2. Поднимаем интерфейс ifb0 ip link set dev ifb0 up

3. Создаем корневую дисциплину для входящего трафика на интерфейсе eth0 tc qdisc add dev eth0 handle ffff: ingress

4. Теперь непосредственно заворачиваем трафик в ifb0 tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 \ action mirred egress redirect dev ifb0

5. Сейчас для входящ. делаем по нормальному, но уже използуем ifb0

tc qdisc add dev ifb0 root handle 1: htb default 20 tc class add dev ifb0 parent 1: classid 1:1 htb rate 20mbit и тд...

----- про ceil в 1:10 - а зачем сверху ограничивать приоритетний трафик - сделай ceil = $RATE

потом rate в 1:10 и 1:20 - у тебя 2mbit+2mbit, а есть 9.5 - разпредели их так что сума будеть = 9.5mbit На теория, даже если нет никакие приоритеты, htb будеть разпределят трафик на база ети соотношения - между rate в класами

Можно прочитать и здесь - ето автор HTB http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm

john33
()
Ответ на: комментарий от john33

john33

а какой смысл ставить у приоритетного выше скорость, когда он у меня все равно больше 2мбит вжизь не будет, мне важно чтобы для воип полюбому выдавалась полоса от 1 до 2мбит и все, для эксперимента сделал $RATE, остальное думаю
пришлось переписать полностью iptables и tc на маркируемые пакеты (по списку серверов и портов), т.к. выяснилось что с tos 0x68 ходят dns запросы

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от wolverin

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

tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match mark 0x1 0xffffffff police rate $RATE burst 10k drop flowid :1

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

Мне не очень понятно что хочеш сделать с ingress.:) Попробуй лимит на все и посмотри работает ли как надо.

tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate $RATE burst 10k drop flowid :1

Сколко у тебя download speed без qos? Как тестируеш?

john33
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.