tc qdisc参数详解
指令`
tc qdisc add dev eth0 parent root handle 6666 mqprio
num_tc 3
map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2
queues 1@0 1@1 2@2
hw 0
以下是对命令中每个参数的详细解释和使用规则:
1. num_tc 3
- 作用:定义流量类别(Traffic Class, TC)的数量。
- 规则:
- 指定网络流量分为 3 个流量类别(TC0、TC1、TC2)。
- 流量类别数量必须与后续
map
和queues
参数一致。
- 示例:
num_tc 3
表示将流量划分为 3 个优先级类别。
2. map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2
- 作用:将 Linux 网络优先级(0-15) 映射到流量类别(TC)。
- 规则:
- 包含 16 个数值,依次对应优先级 0 到 15。
- 每个数值表示映射到的 TC 编号(0-2,因
num_tc=3
)。
- 示例解析:
优先级 0 → TC2 优先级 1 → TC2 优先级 2 → TC1 优先级 3 → TC0 优先级 4-15 → TC2
- 结果:
- 优先级 3 的流量(最高优先级)映射到 TC0。
- 优先级 2 的流量映射到 TC1。
- 其他优先级(包括默认)映射到 TC2(尽力而为流量)。
- 结果:
3. queues 1@0 1@1 2@2
- 作用:为每个流量类别分配硬件队列。
- 规则:
- 格式为
<队列数量>@<起始队列索引>
。 - 流量类别顺序为 TC0、TC1、TC2。
- 格式为
- 示例解析:
TC0 → 1@0:使用 1 个队列,起始索引为 0(队列0)。 TC1 → 1@1:使用 1 个队列,起始索引为 1(队列1)。 TC2 → 2@2:使用 2 个队列,起始索引为 2(队列2 和 3)。
- 结果:
- 总共有 4 个硬件队列(队列0、1、2、3)。
- TC0(高优先级)使用队列0,TC1(中优先级)使用队列1,TC2(低优先级)使用队列2和3。
- 结果:
4. hw 0
- 作用:控制是否启用硬件卸载。
- 规则:
0
:禁用硬件卸载(纯软件处理)。1
:启用硬件卸载(需网卡驱动和硬件支持)。
- 示例:
hw 0
表示所有队列管理由内核处理,不依赖硬件加速。
配置验证与使用规则
-
硬件队列支持:
- 确保网卡支持足够的硬件队列(本例需要至少 4 个 TX 队列)。
- 检查队列数量:
ethtool -l eth0
。
-
流量分类:
- 使用
tc filter
规则将流量按优先级分类到对应 TC。 - 示例:将 VLAN PCP=3 的流量映射到 TC0:
tc filter add dev eth0 protocol 802.1q parent root \flower skip_sw vlan_prio 3 \action skbedit priority 3
- 使用
-
启用硬件卸载(可选):
- 若网卡支持(如 Intel I210),设置
hw 1
并验证驱动支持:ethtool -k eth0 | grep hw-tc-offload
- 若网卡支持(如 Intel I210),设置
-
错误排查:
map
参数越界:TC 编号需小于num_tc
值。- 队列索引越界:起始索引 + 队列数 ≤ 硬件总队列数。
示例场景
- 高优先级流量(TC0,队列0):
- 音视频流(VLAN PCP=3)通过队列0发送,保障低延迟。
- 中优先级流量(TC1,队列1):
- 控制信令(VLAN PCP=2)通过队列1发送。
- 低优先级流量(TC2,队列2/3):
- 普通数据(默认优先级)通过队列2/3发送,允许带宽竞争。
总结
通过 MQPRIO 的配置,可以实现:
- 流量分类:基于优先级将流量映射到不同硬件队列。
- 资源隔离:高优先级流量独占专用队列,避免低优先级流量干扰。
- 扩展性:支持后续为不同队列配置 CBS(带宽整形)或 ETF(时间门控)。
此配置适用于需要 QoS 保障的实时网络(如工业控制、车载网络)。