LINUX.ORG.RU

Сообщения wreckerov

 

проблема шейпинга HTB средствами TC (iproute2)

Всем привет!
Начну с системы - DEBIAN, но вопрос системонезависимый :) ядро - 2.6.32.

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

Суть, как я хотел решить. Измеряю текущую скорость, средств масса. Потом догружаю канал до максимума средствами IPERTF или чем то другим опять же на вкус и цвет много средств. Работает все по принципу клиент-сервер, тоже все подходит. Главное что тестовый трафик я могу генерировать или UDP или TCP на/с произвольный порт. По этим критериям я развешиваю метки и пытаюсь при помощи HTB

Приведу скрипт которым я щас пытаюсь играть:
#!/bin/sh
DEV=eth1
RATEUP=2048
RATEDN=4096
#RATEDN=512

## CLEAN CLASS, QDISK, FILTER (delete root point)
tc qdisc del dev $DEV root
tc qdisc del dev $DEV ingress
tc qdisc del dev ifb0 root
iptables -t mangle -F
# CLEAN OUT IPTABLES MANGLE
#iptables -t mangle -D POSTROUTING -o $DEV -j MYSHAPER-OUT
iptables -t mangle -F MYSHAPER-OUT 2>/dev/null
iptables -t mangle -X MYSHAPER-OUT 2>/dev/null
# CLEAN IN IPTABLES MANGLE
#iptables -t mangle -D PREROUTING -i ifb0 -j MYSHAPER-IN
iptables -t mangle -F MYSHAPER-IN 2>/dev/null
iptables -t mangle -X MYSHAPER-IN 2>/dev/null
#modprobe ifb # лучше добавить в /etc/modules
ip link set dev ifb0 up
## CLEAN END

### OUT RULES
# добавить корневую дисциплину HTB по умолчанию высокий приоритет
tc qdisc add dev $DEV parent root handle 1:0 htb default 20
# добавить общее ограничение скорости по классу
tc class add dev $DEV parent 1:0 classid 1:1 htb rate ${RATEUP}Kbit
# добавляем подклассы, PRIO 0 высший приоритет, по мере увеличения приоритет падает
tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[$RATEUP-1]kbit ceil ${RATEUP}kbit prio 0 # высокий приоритет
tc class add dev $DEV parent 1:1 classid 1:21 htb rate 1kbit ceil ${RATEUP}kbit prio 1 # низкий приоритет
# подключаем дисциплины обработки очереди к подклассам
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:21 handle 21: sfq perturb 10
# направляем трафик в классы по fwmark
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev $DEV parent 1:0 prio 1 protocol ip handle 21 fw flowid 1:21

### IN RULES
# добавляем дисциплину - низкоприоритетный класс по умолчанию 1:20
tc qdisc add dev ifb0 handle 1:0 root htb default 20
# добавляем общее ограничение скорости по классу
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate ${RATEDN}kbit
# добавляем подклассы, PRIO 0 высший приоритет, по мере увеличения приоритет падает
tc class add dev ifb0 parent 1:1 classid 1:20 htb rate $[$RATEDN-1]kbit ceil ${RATEDN}kbit prio 0 # высокий приоритет
tc class add dev ifb0 parent 1:1 classid 1:21 htb rate 1kbit ceil ${RATEDN}kbit prio 1 # низкий приоритет
# подключаем дисциплины обработки очереди к подклассам
tc qdisc add dev ifb0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev ifb0 parent 1:21 handle 21: sfq perturb 10
# направляем трафик в классы по fwmark
tc filter add dev ifb0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev ifb0 parent 1:0 prio 1 protocol ip u32 match ip src 111.222.333.444 flowid 1:21
# перенаправлять входящие пакеты с $DEV в ifb0
tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

# Маркируем
### OUT RULES
iptables -t mangle -N MYSHAPER-OUT # Создать новую цепочку
iptables -t mangle -I POSTROUTING -o $DEV -j MYSHAPER-OUT # прикрепить к политике POSTROUTING
iptables -t mangle -A MYSHAPER-OUT -o $DEV -p tcp -d 111.222.333.444 -j MARK --set-mark 21 # ftp
iptables -t mangle -A MYSHAPER-OUT -o $DEV -m mark --mark 0 -j MARK --set-mark 20 # other

### IN RULES
iptables -t mangle -N MYSHAPER-IN
#iptables -t mangle -I PREROUTING -i ifb0 -j MYSHAPER-IN
iptables -t mangle -I PREROUTING -j MYSHAPER-IN
#iptables -t mangle -A MYSHAPER-IN -i ifb0 -p tcp -s 0.0.0.0/0 -d 0.0.0.0/0 --dport 5001 -j MARK --set-mark 20 # nuttcp
#iptables -t mangle -A MYSHAPER-IN -i ifb0 -p tcp -s 0.0.0.0/0 -d 0.0.0.0/0 --sport 5001 -j MARK --set-mark 20 # nuttcp

iptables -t mangle -A MYSHAPER-IN -i ifb0 -p tcp -s 111.222.333.444 -j MARK --set-mark 21 # ftp
iptables -t mangle -A MYSHAPER-IN -i $DEV -p tcp -s 111.222.333.444 -j MARK --set-mark 21 # ftp
iptables -t mangle -A MYSHAPER-IN -i ifb0 -m mark --mark 0 -j MARK --set-mark 20 # избыточно - маркировать немаркированные
iptables -t mangle -A MYSHAPER-IN -i $DEV -m mark --mark 0 -j MARK --set-mark 20 # избыточно - маркировать немаркированные

####################################################
echo «Outbound shaping added to $DEV. Rate: ${RATEUP}Kbit/sec.»
echo «Inbound shaping added to $DEV. Rate: ${RATEDN}Kbit/sec.»



Суть проблемы в том что при небольших полезных нагрузках измерения вроде как идут нормально! Но стоит загрузить канал хотябы процентов на 70-80... тестовый трафик наносит ущерб полезному.

Например, у меня дома сейчас DOWNSTREAM 4мегабита... скачиваю дистриб дебиана... запускаю измерение(догрузку канала до максимума) скорость скачивания падает до 1,5-2 мегабит... останавливаю трафик тестовый скорость опять поднимается до максимума.

Как правильнее развесить приоритеты? может быть методическая ошибка где то?

wreckerov
()

RSS подписка на новые темы