我在使用 net_cls 控制组与 Linux 流量控制器 (tc) 结合使用来限制网络带宽时遇到了一些问题。我想我可能只是对如何编写过滤规则感到困惑。我认为管理用户网络带宽的最简单方法是使用他们的 uid 作为其 net_cls 控制组 classid 的一部分。因此,我在 cgconfig 文件中设置了以下规则(并不断重新启动机器)。我的 cgrules.conf 中也有正确的设置,因为我对其他控制器(如内存)施加的任何限制都会得到正确反映。
假设我有一个 uid 为 5004,
group cgroup_demo_cg {
net_cls {
net_cls.classid=0x00105004;
#or should it be the hex equivalent of 5004 ?
#net_cls.classid=0x0010138c;
}
}
无论如何,下一步应该是添加一些 tc 内容。句柄10
无论如何,首先创建 qdisk:
tc qdisc add dev eth0 root handle 10: htb
然后设置班级规则:
tc class add dev eth0 parent 10: classid 10:5004 htb rate 4kbit
#or if I had to use the hex value
tc class add dev eth0 parent 10: classid 10:138c htb rate 4kbit
最后应用一个过滤器,我认为无论我使用十六进制值还是 uid 值(5004),它都应该相同:
tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup
因此,我设置完成后,我希望该 cgroup 中用户的任何网络流量的网络带宽都会受到 tc 的相应限制,但事实似乎并非如此。
如果我以用户身份登录,并与我的另一台机器建立 ssh 会话,然后执行 top 命令(它应该发送/接收一些稳定的数据流),然后运行以下命令:
tc -s qdisc ls
我懂了:
qdisc htb 10: dev eth0 root refcnt 2 r2q 10 default 0 direct_packets_stat 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc pfifo_fast 0: dev eth1 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 1364212 bytes 6045 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
这表明我的 qdisk 中从未添加任何内容?:(
有人知道我在这里做错了什么吗?
干杯!