Linux 如何使用tc和cgroups对数据包进行优先级划分

Linux 如何使用tc和cgroups对数据包进行优先级划分,linux,networking,kernel,trafficshaping,Linux,Networking,Kernel,Trafficshaping,我正在尝试对从某个进程组生成的数据包进行优先级排序,以便首先从PC发送数据包。我的目标是使用cgroups和tc来实现这一点,但这似乎不起作用 首先,我在ubuntu上设置了如下cgroups 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_

我正在尝试对从某个进程组生成的数据包进行优先级排序,以便首先从PC发送数据包。我的目标是使用cgroups和tc来实现这一点,但这似乎不起作用

首先,我在ubuntu上设置了如下cgroups

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中流动,我做错了什么?

您应该向您想要控制的流量添加类和过滤器(假设您想要控制HTTP流量)


然后,您可以使用iptraf来验证连接速率。

正确的方法是通知tc您将使用cGroup。这已经在Ubuntu 12.04和3.10内核上得到验证

确保您有网络cls支持 如果没有,

编译支持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条目 创建测试cgroup并进行设置 如果未设置cpuset,某些cgroup设置会出现一般错误。您还必须将主tc类ID和次tc类ID转换为0xAAABBBBBB的十六进制,其中AAAA是主tc类ID,BBBB是次tc类ID

# 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 将任务回送到cgroup中 (但一次只能有一个)

修改tc类 编辑:
我无法使用ingress完成此工作。只有出口(上传)似乎在工作
tc
似乎没有使用带有入口的cgroup选项。

只是猜测而已。firefox使用多线程吗?也许您需要将线程ID放入任务文件中。(ps-eLf)
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
# echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
# reboot
# 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
# echo $FIREFOX_PID > /sys/fs/cgroup/clstest/tasks
# tc class change dev eth2 parent 10: classid 10:1 htb rate 40mbit