der*_*ert 18
从联机帮助页中,唯一的限制burst
是它必须足够高以允许您配置的速率:它必须至少为 rate / HZ。HZ 是内核配置参数;你可以通过检查你的内核配置来弄清楚它在你的系统上是什么。例如,在 Debian 上,您可以:
$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y
Run Code Online (Sandbox Code Playgroud)
所以我系统上的 HZ 是 250。要达到 10mbps 的速率,我因此需要burst
至少 10,000,000 位/秒 ÷ 250 Hz = 40,000 位 = 5000 字节。(请注意联机帮助页中的较高值来自默认 HZ=100 时)。
但除此之外,burst
也是一种政策工具。它配置您现在可以使用较少带宽的程度,以“保存”它以备将来使用。这里的一个常见问题是,您可能希望允许小下载(例如网页)运行得非常快,同时限制大下载。您可以通过增加到burst
您认为是小下载的大小来做到这一点。(不过,您经常会切换到像 htb 这样的全类 qdisc,因此您可以细分不同的流量类型。)
因此:您将突发配置为至少足够大以实现所需的rate
. 除此之外,您可以进一步增加它,这取决于您要实现的目标。
“桶”是一个比喻对象。它的关键特性是它可以容纳代币,并且它可以容纳的代币数量是有限的——如果你试图添加更多,它就会“溢出”,多余的代币就会丢失(就像试图在一个容器中放太多水一样)实际存储桶)。桶的大小称为burst
。
为了实际将数据包传输到网络上,该数据包必须获得等于其字节大小或mpu
(以较大者为准)的令牌。
有(或可能有)一行(队列)等待令牌的数据包。当桶是空的,或者令牌少于数据包的大小时,就会发生这种情况。桶前面的人行道上只有这么多空间,空间量(以字节为单位)由 直接设置limit
。或者,它可以间接设置为latency
(在理想情况下,计算为rate
× latency
)。
当内核想要从过滤接口发送数据包时,它会尝试将数据包放在行尾。如果人行道上没有任何空间,那对数据包来说是不幸的,因为人行道的尽头是一个无底洞,内核会丢弃数据包。
最后一块是令牌制造机,它每滴答都会向桶中添加rate
/HZ
令牌。(这就是为什么你的存储桶必须至少有这么大,否则一些新铸造的代币将被立即丢弃)。
补充德罗伯特的另一个答案。
首先,在现代英特尔 CPU 上,手册已过时。现代 CPU 具有高分辨率计时器,而现代 Linux 的滴答更少——字面意思是没有计时器滴答。因此,所有那些使桶足够大以在一个计时器中容纳令牌的评论都是无关紧要的。事实上,桶类比只是为了帮助用户理解定时器粒度和发送速度之间的交互。现在 Linux 在现代硬件上有纳秒计时器,它失去了它的用处。
对于 TBF,burst参数是在速率限制(由rate指定)开始之前可以以无限速度发送的字节数。一旦开始速率限制,再次突发的唯一方法是将您的发送限制在该速率以下.
例如,假设您的 tbf突发参数是 10K 字节,而您的 tbf速率参数是 2K 字节/秒,并且您当前的速率受到限制(即突发已用完,因此您只能以 2kbps 发送)。如果您自愿将发送速度降低到 1Kbps 并持续 10 秒,您将再次累积 10K 字节的突发容量(= (2000 [字节/秒] - 1000 [字节/秒]) * 10 秒)。将其保持在 1kbps 以下超过 10 秒不会有任何影响,因为 tbf 不允许您累积超过突发参数。
如果您完全停止支出,那么您将在 5 秒内再次获得突发限额(= 100000 [字节] / 2000 [字节/秒])。
您不必取回所有的爆破限额来使用它,您可以使用您积累的多少。
看待这一点的另一种方式是:您可以以无限速度发送突发字节,此后您的长期平均速度永远不会超过rate。但是,因为这是一个长期平均值,如果您低于速率,您可以通过全速发送来赶上 - 但即便如此,您也只能全速发送最多突发字节(如果没有让你赶上你不能)。
另一个问题是 TBF 有两个这样的速率限制器,你的流量必须通过这两个。在第二个中,突发参数称为mtu and,速率称为peakrate。您应该使用第二个来限制第一个可以发送突发的速度。使用第二个是可选的,如果您不使用它,则突发将以设备速度发送。
最后,tbf 有一个限制参数。如果程序持续发送快于rate,则数据包将在队列中堆积。没有无限的内核内存,所以limit表示在内核开始丢弃数据包之前可以建立多少字节。
归档时间: |
|
查看次数: |
8593 次 |
最近记录: |