我试图限制一个应用程序与Linux的TC产生的输出带宽。 此应用程序发送给我的请求的源端口,我使用了一个filter来限制每个用户在给定的下载速度。 我觉得如果我有更好的linux tc知识,我的设置可以更好地pipe理。
在应用程序级别,用户被分类为一个组的成员,每个组都有一个有限的带宽。
例如:
Members of group A : 512kbit/s Members of group B : 1Mbit/s Members of group C : 2Mbit/s
当用户连接到应用程序时,它将检索源端口到用户的请求源,并根据它所属的组向我发送源端口和用户必须限制的带宽。 有了这些信息,我必须添加适当的规则,使用户(实际的源端口)被限制在正确的带宽。
如果连接的用户不是任何组的成员,则应该以默认的带宽速度进行限制。
我实际上是通过使用一个自制的守护进程来pipe理这个守护进程,该守护进程从应用程序收到请求时添加或删除规则。 有了我对tc的一点了解,我就无法以默认的速度限制其他用户(不在组中的所有其他用户),我的configuration对我来说似乎很糟糕。
这是我的tc qdisc和classes的基础:
tc qdisc add dev eth0 root handle 1: htb tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbps ceil 125mbps
要以给定的速度对用户进行分类,我必须添加一个子类,然后将一个filter关联到它:
# a member of group A tc class add dev eth0 parent 1:1 classid 1:11 htb rate 512kbps ceil 512kbps # tts associated filter to match his source port tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 50001 flowid 1:11 # a member of group A again tc class add dev eth0 parent 1:1 classid 1:12 htb rate 512kbps ceil 512kbps # tts associated filter to match his source port tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 61524 flowid 1:12 # a member of group B again tc class add dev eth0 parent 1:1 classid 1:13 htb rate 1000kbps ceil 1000kbps # tts associated filter to match his source port tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 57200 flowid 1:13
我已经知道源端口可能是相同的,如果它来自不同的IP地址的事情是应用程序在代理后面,所以我不必pipe理任何IP地址在这种情况下。
我想知道如何pipe理这样一个事实,即对于所有其他用户(请求/源端口,不pipe你怎么称呼它)都可以以给定的速度进行限制。 我的意思是每个连接应该能够以最大100kbit / s的速率使用,而不是共享的100kbit / s。
我也想知道是否有办法简化我的规则。 我不知道是否可以使用每个组只有一个类,并将多个filter关联到同一个类,以便每个用户可以由一个类处理,而不是每个用户处理一个类。
我很欣赏任何build议,谢谢。