桶大小(TBF)


11

我已经阅读了很多有关Linux的令牌桶过滤器(tbf)的文章,但我仍然不完全了解如何计算burstlatency参数,这对我很可惜:(

我认为合理的延迟时间约为50毫秒。好的,但是应该采取什么值?

联机帮助页上说:

后面的计算考虑了存储桶的大小,速率以及可能的峰值速率(如果已设置)。这两个参数是互斥的。

那么,延迟与存储桶和过滤器有何关系?有计算公式吗?还是仅仅是“好吧,X字节的突发字节和Y秒的延迟对我来说是好事”的问题?


1
对于每个人来说,这个不清楚的地方:tbf是Linux流量控制框架的一部分。man tbfman tc-tbf应该提起文件。
derobert

1
从您的编辑看来,您似乎需要从概念上解释什么是令牌桶过滤器。一旦回到电脑前(将其写在手机上),我就会在答案中添加一个
。– derobert

最后在概念性解释中添加了内容
derobert

Answers:


16

从联机帮助页来看,唯一的限制burst是它必须足够高以允许配置的速率:它必须至少为rate / HZ。HZ是内核配置参数;您可以通过检查内核配置来弄清系统上的内容。例如,在Debian上,您可以:

$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y

因此系统上的HZ为250。要达到10mbps的速率,我burst至少需要10,000,000位/秒÷250 Hz = 40,000位= 5000字节。(请注意,手册页中的较高值是默认值为HZ = 100时的值)。

但除此之外,这burst也是一种政策工具。它配置了您现在可以使用较少带宽以“保存”以供将来使用的程度。这里的一件事是,您可能希望允许小的下载(例如网页)快速运行,同时限制大的下载。通过burst将大小增加到您认为很小的下载量即可完成此操作。(不过,您通常会切换到像htb这样的全类qdisc,因此可以划分出不同的流量类型。)

因此:您将burst配置为至少足够大以实现所需的rate。除此之外,您可以根据要实现的目标进一步提高它。

令牌桶过滤器的概念模型

令牌桶过滤器

“桶”是一个隐喻的对象。它的主要特性是它可以容纳令牌,并且可以容纳的令牌数量是有限的-如果您尝试添加更多令牌,则会“溢出”并且多余的令牌会丢失(就像试图在容器中放入过多的水一样)。实际存储桶)。桶的大小称为burst

为了将数据包实际传输到网络上,该数据包必须获得等于其大小mpu(以字节为单位)或(以较大者为准)的令牌。

有(或可能有)一行(队列)等待令牌的数据包。当存储桶为空或令牌数少于数据包大小时,会发生这种情况。铲斗前面的人行道上只有这么多空间,而空间量(以字节为单位)直接由设置limit。或者,可以使用间接设置latency(在理想情况下,计算为rate× latency)。

当内核想从过滤后的接口发送数据包时,它会尝试将数据包放在行尾。如果人行道上没有任何空间,这对于数据包来说是不幸的,因为在人行道的尽头是一个无底洞,内核将数据包丢弃了。

最后一块是令牌制作机器,它每隔一个滴答声就向桶中添加rate/ HZ令牌。(这就是为什么您的存储桶必须至少这么大的原因,否则一些新创建的令牌将立即被丢弃)。


我认为爆破是相反的,您允许暂时超过该价格,然后由较低的价格进行补偿以达到平均价格...
sebelk

@sebelk我不确定没有RTFS,但可以解决相同的问题,除了将tbf添加到当前在之上运行的接口的情况下rate。还是不可以,就像您只能说水桶开始满了……
derobert

@sebelk:也是。假设我们有一个1000字节(突发大小)的存储桶,令牌率是10字节pr。第二。因此,如果100秒钟内没有数据包到达,则将填充该存储桶。然后,到达的接下来的1000个字节的数据包将立即发送,而无需排队。数据速率中的突发,可能高于令牌创建的速率。
Bjarke Freund-Hansen

5

补充德罗伯特的另一个答案。

首先,在现代英特尔CPU上,该手册已过时。现代的CPU具有高分辨率的计时器,而现代的Linux则没有刻度线-从字面上意味着没有计时器刻度线。因此,所有那些使存储桶足够大以将令牌保存在一个计时器中的注释都是无关紧要的。实际上,桶类比只是在帮助用户了解计时器粒度和发送速度之间的交互。现在,Linux在现代硬件上具有纳秒计时器,它失去了它的用处。

对于TBF,burst参数是在速率限制(由rate指定)开始生效之前可以无限速发送的字节数。一旦速率限制生效,再次爆发的唯一方法是将发送限制为低于该速率。

例如,假设您的tbf 突发参数为10K字节,tbf 速率参数为2K字节/秒,并且您当前受速率限制(即,突发已耗尽,因此您只能以2kbps的速率发送)。如果您自愿将以1Kbps发送的速度降低了10秒钟,则会再次累积10K字节的突发容量(=(2000 [字节/秒]-1000 [字节/秒])* 10秒)。将其保持在1kbps以下10秒钟以上不会产生任何效果,因为tbf不允许您累积的数据超过了burst参数。

如果您完全停止支出,那么您将在5秒内再次获得突发配额(= 100000 [字节] / 2000 [字节/秒])。

您不必重新使用所有的突发津贴,就可以累积使用尽可能多的津贴。

另一种看待这种情况的方式是:允许您以无限制的速度发送突发字节,此后,您的长期平均速度永远不会超过rate。但是,由于这是长期的平均值,因此如果您降低速率以下,则可以通过全速发送来追赶-但即使如此,您也只能以最大突发字节的速率进行全发送(如果不这样做)让你赶上你不能)。

另一个问题是,TBF有两个限速器,您的流量必须同时通过。在第二个参数中,burst参数称为mtu和,速率称为peakrate。您应该使用第二个来限制第一个发送突发的速度。使用第二个是可选的,如果不使用它,则突发以设备速度发送。

最后,tbf具有限制参数。如果程序持续发送速度超过rate,则数据包将在队列中累积。没有无限的内核内存,因此limit表示在内核开始丢弃数据包之前可以建立多少字节。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.