qos 这个话题随着经验增长,挺有趣的。
当年在使用 modem 时
当上行 60%时,延迟极低,下载速度最大化。
当上行 80%时,延迟开始变得更高,下载速度开始受影响。
当上行超过 80%时,延迟开始变得更高,下载速度开始变低。
所以,当你有办法把上行流量控制在 80%时,似乎说的就是 SQM(tc scripts)那一套,当然没有 SQM 宣传的每 IP 平均化。QOS 要做的是当上行流量超过 80%时,该如何控制延迟。当然这个 80%不是直接在一些普通路由器设置为 80%总上行。按照 tc 反馈的结果这样设置依然有延迟问题。
于是从 56kmodem>2m adsl>4M adsl>8M 光纤>20m 光纤>100m 光纤 20mbps 上行
随着带宽的不断变大,上行越来越大,越来越不可能达到 80%的上行,延迟问题也就越来越不明显。当然这中间,在 4~8M 时也遇到并发数导致 qos 失效,甚至一些 403 的重定向导致下载流量远远超过 qos 限制的下载,影响了延迟结果。至今百思不得其解。
在 mips 小路由,以前用 ddwrt 时 imq 接口会让路由直接 cpu 耗死机。。。ifb 倒稍微测试了一下,取得了一些非常奇异的结果就是上行的标记可以出现在下行的流量里,直接进入 qos 队列。当然基于对这些 tun 接口 cpu 性能消耗的担忧,现实中依然不敢用这些接口,而是直接作用于 eth1/br-lan/pppoe-wan???。
sqm 并不具备 tomato 路由的每包到链接的过程,导致之前测试时 cpu 性能消耗非常厉害,讨论中动不动就去换个 cpu 性能更好的路由。。。
$IPT -t mangle -I QOSO -m mark ! --mark 0/0xff -j ACCEPT #ACCEPT
$IPT -t mangle -A QOSO -j CONNMARK --save-mark --mask 0xff
$IPT -t mangle -I PREROUTING 2 -i $UDEV -j CONNMARK --restore-mark --mask 0xff
这么多年过去了,在 100mbps 线路,上行一直跳不出这个设置,下行动态抓取实时有流量的 ip ,不需要根据 ip 做平均,做到带宽的 100%利用。
# add HTB root qdisc
$TC qdisc del dev $UDEV root 2>/dev/null
$TC qdisc add dev $UDEV root handle 1: htb default 40 r2q 300
#$TC class add dev $UDEV parent 1: classid 1:1 htb rate 1Gbit ceil 1Gbit
$TC class add dev $UDEV parent 1: classid 1:1 htb rate 150Mbit ceil 150Mbit
#$TC class add dev $UDEV parent 1:1 classid 1:100 htb quantum 1514 rate $((UPLINK*10/100))kbps ceil 1Gbit prio 5
$TC class add dev $UDEV parent 1:1 classid 1:2 htb rate $((UPLINK*8/10))kbps ceil $((UPLINK*9/10))kbps
#$TC class add dev $UDEV parent 1:1 classid 1:10 htb quantum 1514 rate $((UPLINK*1/10))kbps ceil $((UPLINK))kbps prio 0
$TC class add dev $UDEV parent 1:1 classid 1:10 htb rate $((UPLINK*1/10))kbps ceil $((UPLINK))kbps prio 0
$TC class add dev $UDEV parent 1:1 classid 1:20 htb rate $((UPLINK*1/10))kbps ceil $((UPLINK))kbps prio 2
$TC class add dev $UDEV parent 1:2 classid 1:30 htb rate $((UPLINK*3/10))kbps ceil $((UPLINK*90/100))kbps prio 3
$TC class add dev $UDEV parent 1:2 classid 1:40 htb rate $((UPLINK*3/10))kbps ceil $((UPLINK*85/100))kbps prio 4
# cat /tmp/port.tmp
udp_6060_0x10/0xff
tcp_992,1992_0x10/0xff
udp_53,123_0x20/0xff
tcp_22,23,3389_0x20/0xff
tcp_80,443,1080,1863,8080:8081,12000,14000,15000,16285_0x30/0xff
udp_80,443,500,1701,3478:3481,4000:4030,4500,5989,8000:8020,16285,50000:55000_0x30/0xff
tcp_20,21,25,143,465,993,1024:65535_0x40/0xff
udp_1:65535_0x40/0xff