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)
没有评论:
发表评论