我正在使用带有 TBF 的 TC 工具来限制 Linux PC 出口链路的速率。我正在使用以下命令:
tc qdisc add dev DEVICENAME root handle 1: tbf rate 40Mbit buffer 40kb limit 8000
这工作正常。当我在连接到出口链接的 PC 上进行互联网速度测试时,我收到的平均速度为 40Mbps。
但是,我的要求是我想以 1 秒的间隔更改速率,即每秒,我将速率降低 1 Mbps 的步长。为此,我编写了一个 Python 代码,它以 1 秒的间隔执行以下命令:
tc qdisc replace dev DEVICENAME root handle 1: tbf rate 39Mbit buffer 40kb limit 8000
tc qdisc replace dev DEVICENAME root handle 1: tbf rate 38Mbit buffer 40kb limit 8000
.
.
.
tc qdisc replace dev DEVICENAME root handle 1: tbf rate 25Mbit buffer 20kb limit 4000
wherereplace
是一个原子操作,它removes
和adds
新策略在同一个句柄上。虽然这些命令每秒执行一次,但我正在并行观察实时流。对于该实时流,40Mbps 到 25Mbps 足以提供高质量的流。
但问题是,每次以新的速率(比如 39Mbit)执行命令时,我观察到流中的很多抖动,就好像流中的某个人刚刚从一个位置跳到另一个位置一样。流中的平滑度被扰乱了几秒钟,比如 2-5 秒。
我幼稚的理解是,每当应用新规则时,现有 qdisc 的队列和缓冲区中的数据包都会被丢弃,并且带有新策略的新 qdisc 开始接收流的下一个数据包。由于现有的 qdisc 丢弃了这么多数据包,我观察到直播流中的抖动。
我的理解是正确的还是我遗漏了什么?
还请分享有关如何对链接进行速率控制的想法,以便顺利过渡到更新的速率。非常感谢。