2012年2月26日星期日

tc-pfifo,tc-bfifo和pfifo_fast

这三种都是classless的Queuing Discipline。classless的qdisc可以用来对特定的接口进行总的限制,不能划分子类,但可以应用在子类上。

Linux默认的qdisc是pfifo_fast,这种fifo有三个队列,FIFO0,FIFO1,FIFO2,对应的优先级分别从高到低,分为3个band,0最先调度,0处理完后,其次是1,然后是2,优先级对应于包内的ToS字段,那些需要最小时延的包会被放到band0中。

ToS和band之间的映射关系如下:


TOS     Bits  Means                    Linux Priority    Band
------------------------------------------------------------
0x0     0     Normal Service           0 Best Effort     1
0x2     1     Minimize Monetary Cost   1 Filler          2
0x4     2     Maximize Reliability     0 Best Effort     1
0x6     3     mmc+mr                   0 Best Effort     1
0x8     4     Maximize Throughput      2 Bulk            2
0xa     5     mmc+mt                   2 Bulk            2
0xc     6     mr+mt                    2 Bulk            2
0xe     7     mmc+mr+mt                2 Bulk            2
0x10    8     Minimize Delay           6 Interactive     0
0x12    9     mmc+md                   6 Interactive     0
0x14    10    mr+md                    6 Interactive     0
0x16    11    mmc+mr+md                6 Interactive     0
0x18    12    mt+md                    4 Int. Bulk       1
0x1a    13    mmc+mt+md                4 Int. Bulk       1
0x1c    14    mr+mt+md                 4 Int. Bulk       1
0x1e    15    mmc+mr+mt+md             4 Int. Bulk       1


包结构,TOS字段4bit,另外后面还有1bit,总是0:

   0     1     2     3     4     5     6     7
+-----+-----+-----+-----+-----+-----+-----+-----+
|                 |                       |     |
|   PRECEDENCE    |          TOS          | MBZ |
|                 |                       |     |
+-----+-----+-----+-----+-----+-----+-----+-----+


4bit ToS字段:

Binary Decimcal  Meaning
-----------------------------------------
1000   8         Minimize delay (md)
0100   4         Maximize throughput (mt)
0010   2         Maximize reliability (mr)
0001   1         Minimize monetary cost (mmc)
0000   0         Normal Service
 
 
pfifo_fast的队列长度不能通过tc命令设置,只能通过ifconfig设置整个接口的队列(见下面的说明) 




另外还有两种先进先出的排队策略,一种是pfifo,按包的个数限制队列长度,另一种是bfifo,按字节数来限制队列长度

tc qdisc ... add pfifo [ limit packets ]

tc qdisc ... add bfifo [limit bytes]

使用这个来代替默认的qdisc的原因是,他们有统计信息。

参数: limit,默认pfifo的值是txqueuelen,这个可以通过ifconfig或ip命令来指定,txqueuelen是设备中的传输队列,通常在慢速连接上会设置比较小的值,防止突发的流量导致接口这里出现长时间的拥塞,造成时延增大,影响交互应用;默认bfifo的值是txqueueulen * MTU。

要设置txqueuelen,可以使用ifconfig:

ifconfig eth0 txqueuelen 10

可以使用下面的命令来查看接口的网络统计信息:


# tc -s qdisc ls dev eth0
qdisc pfifo 8001: dev eth0 limit 100p
 Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)

没有评论:

发表评论