我有一个 1Gb 网络,我需要通过将速率限制为 100MB,然后限制为 1Gb 来运行某些 TCP 性能测试。我的理解是可以使用分层 token 桶(htb)来实现这一点,如下所示
tc qdisc add dev eth0 root handle 1: htb default 12
tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbps ceil 1gbps
tc class add dev eth0 parent 1: classid 1:10 htb rate 100mbps ceil 100mbps
这应该创建两个根类 1:1 和 1:10,分别具有 1gb 和 100mb 带宽。如果我的理解有误,请指正。
接下来,我如何在我的 tcp 应用程序中使用上述类?例如,当我运行应仅使用 100 Mb 的应用程序时,我是否需要在套接字选项中指定某些内容,以便应用程序发送的任何消息现在都属于 1:1 类,因此速率限制为 100 Mb?
最佳答案
使用流量控制匹配规则和iptables规则来标记流量。
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:10
iptables -A OUTPUT -i eth0 -p tcp -j MARK --set-mark 1
将把所有 TCP 出站数据包放入您拥有的每秒 100 兆的队列中。
由于您只想匹配一个应用程序,因此让我们假设您的应用程序有一个 TCP 套接字监听端口 7654,所有连接都通过该端口进行。 iptables 规则看起来更像这样
iptables -A OUTPUT -i eth0 -p tcp -m multiport --sports 7654 -j MARK --set-mark 1
此外,您还应该在 tc qdisc
命令中将 1 Gbps 队列设置为默认值,以便系统上的正常流量不会以任何方式影响您的测试。
关于linux - 如何将 linux tc 与 tcp 应用程序一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15353304/