Mad*_*nga 5 linux networking kernel trafficshaping
我正在尝试对从特定进程组生成的数据包进行优先级排序,以便首先选择它们以从PC传输出去。我的目标是通过使用cgroups和tc来做到这一点,但似乎不起作用。
首先,我在ubuntu上设置了cgroup,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
在Firefox中浏览并运行后,
tc -s qdisc ls dev eth0
Run Code Online (Sandbox Code Playgroud)
我明白了
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
Run Code Online (Sandbox Code Playgroud)
相反,我希望流量在句柄10中流动,我在做什么错?
执行此操作的正确方法需要通知 tc 您将使用 cgroup。这已在具有 3.10 内核的 Ubuntu 12.04 上得到验证。
$ 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
Run Code Online (Sandbox Code Playgroud)
如果不,
只需将所有这些选项放入您的 .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
Run Code Online (Sandbox Code Playgroud)
然后制作并安装。
# echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
# reboot
Run Code Online (Sandbox Code Playgroud)
如果未设置 cpuset,某些 cgroup 设置会抱怨一般错误。您还必须将主要和次要 tc 类 ID 转换为 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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
(但一次只能有一个)
# echo $FIREFOX_PID > /sys/fs/cgroup/clstest/tasks
Run Code Online (Sandbox Code Playgroud)
# tc class change dev eth2 parent 10: classid 10:1 htb rate 40mbit
Run Code Online (Sandbox Code Playgroud)
我无法通过 ingress 完成这项工作。只有出口(上传)似乎正在工作。tc似乎没有采用带有 ingress 的 cgroup 选项。