token bucket的概念比较简单,但是设置的时候有些参数需要说明一下。
原理:token会被定期的注入到桶中,如果有token就能发数据,这里token对应的单位是字节而非包个数。桶的大小决定了突发的数据量,当桶很大时,可能会造成瞬间的突发流量,为了限制,可以使用peakrate参数。peakrate的实现本质上就是另外一个token bucket,只是桶比较小(通常只允许一个包),不允许突发的流量。因为是在每个tick到来时注入token的,对于HZ=100的情况,那每秒钟就有100个tick,如果每个tick注入一个包,并假设包大小为1000bytes,那么每秒钟的最高速率peakrate就是100*1000bytes/s = 100KB/s ≈ 1mbit/s。当然,这个是最理想的情况,基本上没有burst(可以达到更高的速率,但会带来一些burst。
参数:
limit - 除了桶之外,还有一个buffer,桶放token,buffer放数据,如果token不够用,数据就缓存在buffer中,这个limit就是这个buffer的大小。
latency - 允许的最大时延,数据被缓存就会造成时延的增大,latency * min(rate, peakrate) = limit,limit和latency不能同时设置。
rate - token注入的速率,也可以认为是带宽限制。
burst/buffer/maxburst - 桶的容量(字节数),如果限速越高,需要设置的burst就越大,因为tick的精度有限制。比如在intel机器上,如果要设置10mbit/s的限速,每秒100个tick(HZ=100),每个tick需要的token就是10mbit/100=100000bit=10KByte,这个就是桶的大小。这里还可以指定cell,cell和内部实现相关,基本上不用去考虑设置。
mpu - minium packet usage,每个包不管大小多大,都需要消耗token(payload为0,但还有包头或Padding),这个值指定了一个包需要消耗的最小token量(字节),默认为0。
peakrate - 和rate一样,只是用于第二个桶(peakrate桶),intel机器最大理想值为1mbit/s, Alpha机器最大理想值10mbit/s,即默认一个包的突发流量。一般不用设置。如果需要毫秒级别的控制(burst不能过大)则需要调小这个值。注意这里peakrate的是必须要比rate大的(如果设置peakrate的话)。
mtu/minburst - 只有peakrate设置了才有效,设置peakrate桶的大小。理想的情况是设置成接口的MTU。这个值设置大会带来burst,一般不用去设置。
参考链接:http://linux.die.net/man/8/tc-tbf
没有评论:
发表评论