Как приоритизировать пакеты с помощью tc и cgroups

Я пытаюсь расставить приоритеты для пакетов, генерируемых определенной группой процессов, чтобы они были выбраны первыми для передачи с ПК. Я стремлюсь сделать это с помощью cgroups и tc, но, похоже, это не работает.

Сначала я настроил cgroups на Ubuntu следующим образом:

modprobe cls_cgroup # load this module to get net_cls

mkdir /sys/fs/cgroup/net_cls  # mount point

mount -t cgroup net_cls -onet_cls /sys/fs/cgroup/net_cls/

mkdir /sys/fs/cgroup/net_cls/foo # new cgroup

echo 0x00010001 > /sys/fs/cgroup/foo/net_cls.classid  # echo in a class id

echo 2348 > /sys/fs/cgroup/net_cls/foo/tasks # echo in pid of firefox

tc qdisc add dev eth0 root handle 1: pri

tc qdisc add dev eth0 parent 1:1 handle 10: sfq

tc qdisc add dev eth0 parent 1:2 handle 20: sfq

tc qdisc add dev eth0 parent 1:3 handle 30: sfq

и после просмотра в Firefox и запуска,

tc -s qdisc ls dev eth0

Я получил,

qdisc prio 1: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 29351 bytes 154 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 10: parent 1:1 limit 127p quantum 1514b divisor 1024 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 20: parent 1:2 limit 127p quantum 1514b divisor 1024 
 Sent 27873 bytes 143 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 30: parent 1:3 limit 127p quantum 1514b divisor 1024 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

Вместо этого я хочу, чтобы трафик проходил через дескриптор 10, что я делаю неправильно?


person Madura Anushanga    schedule 28.03.2012    source источник
comment
Просто дикая догадка. Использует ли firefox несколько потоков? Возможно, вам нужно поместить идентификаторы потоков в файл задач. (ps -eLf)   -  person Michael Closson    schedule 20.04.2013


Ответы (2)


Правильный способ сделать это требует информирования tc о том, что вы будете использовать cgroups. Это было проверено на Ubuntu 12.04 с ядром 3.10.

Убедитесь, что у вас есть поддержка net_cls

$ cat /proc/cgroups 
#subsys_name    hierarchy   num_cgroups enabled
cpuset  1   2   1
cpu 1   2   1
cpuacct 1   2   1
memory  1   2   1
net_cls 1   2   1
blkio   1   2   1

если не,

Скомпилируйте ядро ​​с поддержкой net_cls

Просто поместите все эти параметры в свой .config. Кажется, что они не существуют в menuconfig.

CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_CLS_ACT=y
CONFIG_NET_CLS_IND=y

потом сделать и установить.

Убедитесь, что у вас есть запись /etc/fstab

# echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
# reboot

Создайте тестовую группу и настройте ее.

Некоторые настройки cgroup жалуются на общие ошибки, если cpuset не установлен. Вы также должны преобразовать свой основной и дополнительный идентификатор класса tc в шестнадцатеричный вид 0xAAAABBBB, где AAAA является основным, а BBBB — второстепенным.

# mkdir /sys/fs/cgroup/clstest
# /bin/echo 0 > /sys/fs/cgroup/clstest/cpuset.mems
# /bin/echo 0 > /sys/fs/cgroup/clstest/cpuset.cpus
# /bin/echo 0x100001 > /sys/fs/cgroup/clstest/net_cls.classid

Настроить тк

# tc qdisc add dev eth2 root handle 10: htb
# tc class add dev eth2 parent 10: classid 10:1 htb rate 10mbit
# tc filter add dev eth2 parent 10: protocol ip prio 10 handle 1: cgroup

Эхо задач в cgroup

(но только по одному)

# echo $FIREFOX_PID > /sys/fs/cgroup/clstest/tasks

Изменить класс tc

# tc class change dev eth2 parent 10: classid 10:1 htb rate 40mbit

РЕДАКТИРОВАТЬ:

Я не смог сделать эту работу с входом. Кажется, работает только выход (загрузка). tc не использует параметр cgroup при входе.

person Nicholas Andre    schedule 02.07.2013

Вы должны добавить класс и фильтр к трафику, который хотите контролировать (предположим, что вы хотите контролировать HTTP-трафик).

# tc class add dev eth0 parent 1:1 classid 1:1 htb rate 500mbit ceil 800mbit burst 10k prio 10
# tc filter add dev eth0 parent 1:1 protocol ip prio 10 u32 match ip dport 80 0xffff flowid 1:1

Затем вы можете использовать iptraf для проверки скорости соединения.

person shawnzhu    schedule 24.06.2013