我已经为 tc prio qdisc 苦苦挣扎了几个小时。我已经阅读了 lartc 文档、示例和操作指南,但这整件事对我来说有点新,有点令人困惑 :)
这是我的情况:几个文件服务器处理大量 http 和 ftp 流量。我需要优先处理 mysql 流量,因为通常当链接已满时,sql 流量会变慢和/或乱码,从而导致连接错误、超时等。
这是我目前所拥有的:
# tc qdisc add dev eth0 root handle 1: prio
# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1
# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 3306 0xffff flowid 1:1
# tc filter add dev eth0 parent 1: prio 3 protocol all u32 match u32 0 0 flowid 1:3
# tc -s qdisc ls dev eth0
qdisc prio 1: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 125836067 bytes 87549 pkt (dropped 0, overlimits 0 requeues 347)
backlog 0b 0p requeues 347
如果我没有误解 lartc 文档的话,这应该将 ssh 和 mysql 流量放入 prio 频段 1,将其他所有流量放入 prio 频段 3,根据文档,prio qdisc 默认有 3 个频段,较低的频段应具有较高的优先级
有人能证实或否认这一点吗?或者你有其他想法吗?在绝对确定它能正常工作之前,我不想在生产系统上测试它。我对这些统计数据感到厌烦,因为它们没有显示流量的明确分离
编辑:我刚刚用这个配置做了一些测试,在服务器上执行 ping,加载链接,ping 从 40ms 变为 170ms。执行此操作:
# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1
Ping 值下降到 40ms,所以这可能已经起作用了 :)
编辑2:经过更多测试后,我得出以下结论:
tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 3306 0xffff flowid 1:1
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1
为了匹配“任何其他流量”,可以使用:
tc filter add dev eth0 protocol ip parent 1: prio 2 u32 match ip src 0/0 flowid 1:2
或者
tc filter add dev eth0 parent 1: prio 2 protocol all u32 match u32 0 0 flowid 1:2
但我发现不指定“全部捕获”过滤器也同样有效,似乎默认优先级范围已经很低了。
答案1
总而言之,这是一个简单的解决方案,可以根据任何参数获得优先流量,而不会限制带宽
tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 3306 0xffff flowid 1:1
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1
解释:
- 创建一个名为 1 的 prio qdisc:
- 添加匹配端口 22 -> 波段 1 的过滤器
- 添加另一个匹配端口 3306 -> 频段 1 的过滤器
- 另一个过滤器匹配协议 1 (icmp) -> band 1
您可以使用“u32 match src”或指定一项运动或任何协议
答案2
默认的 pfifo_fast qdisc 应该已经能够通过遵守 ToS 位来执行您想要的操作。因此,另一种解决方案(完全不影响 tc)是仅配置您的 ssh 和 MySql 守护进程以在其流量上设置 ToS 位。