Как приотизировать пакеты используя 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, что я делаю не так?
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
# 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 при входе.
Вы должны добавить класс и фильтр к трафику, которым хотите управлять (предположим, вы хотите контролировать трафик 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
проверить скорость соединения.