我已经阅读了很多次关于Linux’s token bucket filter (tbf)但仍然不完全理解我应该如何计算突发和延迟参数,对我感到羞耻:(
我想合理的延迟大约是50毫秒.好的,但应该突破什么价值呢?
该联机帮助页说:
The latter calculation takes into account the size of the bucket,
the rate and possibly the peakrate (if set). These two parameters are
mutually exclusive.
那么,延迟与桶和过滤器有什么关系呢?有计算公式吗?或者只是一个问题,“好吧,X字节的突发和Y秒的延迟对我有好处”?
解决方法:
从联机帮助页中,对爆发的唯一约束是它必须足够高以允许您配置的速率:它必须至少为速率/ HZ. HZ是内核配置参数;您可以通过检查内核配置来弄清楚系统中的内容.例如,在Debian上,您可以:
$egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y
所以我系统上的HZ是250.要达到10mbps的速率,我需要至少10,000,000比特/秒÷250 Hz = 40,000比特= 5000字节的突发. (注意,联机帮助页中的较高值来自HZ = 100时的默认值).
但除此之外,爆发也是一种政策工具.它配置了您现在可以使用更少带宽来“保存”以供将来使用的程度.这里有一个常见的事情是,您可能希望允许小型下载(例如,网页)非常快,同时限制大量下载.您可以通过将突发增加到您认为小型下载的大小来实现此目的. (虽然,你经常切换到类似htb的有类qdisc,所以你可以分割出不同的流量类型.)
因此:您将突发配置为至少足够大以实现所需的速率.除此之外,你可以进一步增加它,这取决于你想要达到的目标.
令牌桶过滤器的概念模型
“桶”是一个隐喻对象.它的关键属性是它可以保存令牌,并且它可以容纳的令牌数量是有限的 – 如果你试图添加更多,它会“溢出”并且额外的令牌会丢失(就像试图在水中放入太多水一样)实际的桶).桶的大小称为突发.
为了实际将数据包传输到网络上,该数据包必须获得等于其大小(以字节或mpu为单位)的令牌(以较大者为准).
存在(或可以)等待令牌的分组的行(队列).当存储桶为空时,或者具有比数据包大小更少的令牌时,会发生这种情况.在水桶前面的人行道上只有这么多的空间,房间的数量(以字节为单位)是由限制直接设定的.或者,它可以间接地设置延迟(在理想的世界中,计算将是速率×延迟).
当内核想要从过滤的接口发送数据包时,它会尝试将数据包放在行的末尾.如果人行道上没有任何空间,那对于包裹来说是不幸的,因为在人行道的尽头是一个无底洞,内核掉落了包裹.
最后一块是一个令牌制作机,每次打勾都会将速率/ HZ令牌添加到桶中. (这就是为什么你的桶必须至少这么大,否则一些新的令牌会被立即丢弃).