这是我第一次尝试使用 tc。我试图实现的是限制通过充当网关的虚拟机的下载速率。虚拟机有两个以太网接口。来自用户的流量进入 eth0,并通过 eth1 退出以到达互联网。这两个接口是桥接的。设置工作正常,并且无需使用 tc 施加任何限制,我就可以实现约 10-11MB/s 的下载/上传速度。
为了限制下载流量,我在 eth0 上应用了 tbf qdisc。例如,当我想限制下载速率时,我使用以下命令:
tc qdisc add dev eth0 handle 10: root tbf rate $R burst 15k latency 25ms
这对于将速率限制在 2MB/s 以内来说还算可以,但是当对速率设置更高的限制时,我开始看到波动。我尝试了不同的延迟和突发值,我注意到,如果对于较大的速率,我将突发值增加到 40K,将延迟增加到 50ms,在某些情况下,波动会更小,但情况并非总是如此。
总体而言,我注意到以下几点:
- 在所有情况下,即使有波动,我能实现的最大利率也约为我在 tbf 上设定的利率的 90%。
- 即使对于 <2MB/s 的速率,我也看到小幅波动。例如,设置 1MB/s 的速率限制将使速率保持相当稳定的 920KB/s,但会瞬间降至 880KB/s,然后又回到 920-921KB/s。经过调查,当这些波动发生时,我注意到
watch tc -p -s -d qdisc show dev eth0
积压会增加,而当速率下降时,积压会减少。在 1MB/s 的情况下,积压会增加 30-40p,然后当它下降时,下载速率会出现瞬间波动。 - 在速率较大导致波动较大的情况下,例如,当设置速率限制为 6MB/s 时,速率可能会下降到 2MB/s,然后在 2MB/s 和 4MB/s 之间不断波动。根本不稳定。在这种情况下,我发现积压可以达到 120p,当它下降到 0 时,丢失的数据包会增加,从而导致大幅波动。
我测试该设置是否有效的方法是使用流量穿过此网关虚拟机的机器,然后执行以下操作:
- 我使用 speedtest.com 来测量速度,它可以给出有关速率的正确值,即速率总是接近我设定的值。
- 我使用 wget 从互联网上下载大型文件(Linux ISO 文件)并监控下载速率。这些情况是我看到波动最多的情况,限制越低,波动越小。此外,从某些服务器下载时波动比其他服务器小。我可以理解这与服务器有关,但是当我从 eth0 中删除 tbf qdisc 时,我获得的下载速率相当稳定,为 10.2-10.6 MB/s。因此,tbf 及其配置一定与下载速率波动的原因有关。
- 最后,为了排除互联网上的流量拥堵,我使用 SCP 从办公室网络中的另一台 PC 下载 ISO 文件。使用 SCP 的速率似乎很稳定。至少比使用 wget 的方法稳定得多。
我尝试阅读大量关于 tc 和 tbf 的资料,也尝试使用 htb 和 cbq,但这些 qdisc 在我的情况下下载速率更不稳定。到目前为止,在我的测试中,只有 tbf 最稳定,但速率过大时就会出现问题。
因此我想问一下:
- 一般来说,我使用 tc 设置的速率应该有多稳定?
- 使用 tbf qdisc 只能达到我指定的速率的~90%是否正常?
- 积压是什么意思?我试图找出它是什么,但我找不到任何关于它表达什么的文档。然而,我相信这可能是汇率不稳定的原因,因为当它处于较低值时,汇率似乎稳定在指定值的 90%,只有当它变得太大然后返回到零/低值时,我才会注意到汇率的波动。
- 我怎样才能更好地优化 tbf 使其更加稳定?
- 我所采用的测试速率限制方法是否正确?如果不正确,是否有更好、更准确的方法来测试并确保我的速率限制有效?
我知道这里面有很多信息,我尽量详细地描述我的情况。如果您能指点如何使用 tbf 实现稳定的下载速率,我将不胜感激。提前谢谢您。
答案1
对于 tc,没有“一般”期望,这取决于您使用的 qdisc。关于 TBF,您可以在“内核中心之旅”中阅读 tbf 的一些限制(所有流量都通过单个队列)。
在 lartc 上,您可以看到您必须根据带宽增加 tbf 存储桶大小。
积压基本上是队列的长度,你可以阅读更多信息这里例如。
当积压清空时,你的带宽会下降(这是不应该发生的),记住这故事中,TCP 队列中的垃圾收集影响了延迟。您可以尝试了解发生了什么。
90% 点可能来自您指定的开销以及协议比率:如果您以 1MB/s 的速度调整上传速度,并且您发送的每个数据包都会收到 10 个数据包,那么您的下载速度就会为 10MB/s。
不过,我对 tbf 了解不多,无法帮助您进行配置。祝您好运!