如何使用 tc 限制每个连接的带宽?

如何使用 tc 限制每个连接的带宽?

我对 Linux 和 tc 命令还很陌生,最近我一直在寻找一种使用 tc 命令限制每个连接带宽的解决方案。我有一个服务器应用程序,用于处理来自客户端的由 I/O 操作组成的请求,如果有足够的带宽,我希望每个请求达到 50MB/s 的最大速度(但我确保没有太多并行请求,这样每个请求的带宽将低于 50MB/s)。我设法使用 tc 来限制带宽,但所有连接都分割 50MB 带宽,而不是每个连接获得 50MB 带宽。您可以在下面看到我尝试过的 tc 命令:

sudo tc qdisc add dev eth4 root netem rate 400mbit

或者

sudo tc qdisc add dev eth4 root handle 1: htb default 30
sudo tc class add dev eth4 parent 1: classid 1:1 htb rate 100gbit burst 15k

sudo tc class add dev eth4 parent 1:1 classid 1:10 htb rate 400mbit burst 15k
sudo tc class add dev eth4 parent 1:1 classid 1:20 htb rate 400mbit burst 15k 

sudo tc filter add dev eth4 protocol ip parent 1: prio 1 u32 match ip dst 0.0.0.0/0 flowid 1:10
sudo tc filter add dev eth4 protocol ip parent 1: prio 1 u32 match ip src 0.0.0.0/0 flowid 1:20

或者,由于我同时控制服务器和客户端,并且我知道服务器在端口 9000 上处理客户端的请求,因此我在客户端托管计算机上尝试了以下操作:

sudo tc qdisc add dev eth4 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
sudo tc qdisc add dev eth4 parent 1:2 handle 20: netem rate 400mbit
sudo tc filter add dev eth4 parent 1:0 protocol ip u32 match ip dport 9000 0xffff flowid 1:2

然而,这些解决方案都没有达到我想要的效果。从我到现在为止的理解来看,我认为我需要为发送请求的每个端口创建一个类,但我事先并不知道它们,因为它们不是由我分配的,而是自动选择的。从这个意义上说,是否有一种方法可以“随时随地”创建这些类,或者是否有其他方法可以实现这一目标?

感谢您的时间和帮助!

相关内容