这几年我经手过的网络故障里,因为QoS质量配置翻车的案例排得上前三。最近一次是在一家做跨境电商的客户现场:白天办公一切正常,一到晚上自动数据同步任务启动,出口带宽立刻被占满,海外办公室的视频会议连着断了三场。查了一圈广域网链路、防火墙策略、DNS解析都没问题,最后点开路由器接口统计才定位到——QoS策略虽然挂在接口上,但分类模板里的ACL早就跟不上业务变化,同步流量没被归进限速队列,大半夜把实时语音包全挤丢了。这类问题在明确标注“QoS质量配置”的场景里非常典型,也是今天这篇内容想讲透的东西:QoS到底在解决什么问题、配置前需要想清哪些决策、一条完整的MQC策略链路怎么搭、上线后靠什么数据判断有没有生效。适合被“带宽够用但视频还是卡”困扰的运维,以及那些刚接手核心网络、打算系统性梳理QoS质量配置却不知道从哪里下手的工程师。
1. QoS质量配置到底在解决什么问题:先分清“卡”的类型
很多业务反应慢,第一反应就是带宽不够,于是扩容。但实际上QoS管不了的事很多,它只在一种特定场景下才真正有价值——网络出现拥塞,也就是流量到达速率超过了接口的发送能力。没有拥塞,数据包全都按顺序立刻发出去,配置再多队列也没意义,这解释了为什么有些链路明明配置了复杂的QoS,业务却看不出任何感知改善。
要做QoS质量配置,第一步不是写命令,而是判断当前网络的问题属于哪种“卡”。
1.1 业务慢的根因判断:瓶颈到底在哪一跳
延迟高和丢包高是两回事。我在处理故障时,习惯先问三个问题:
- 卡在上行还是下行?过了WAN口就不卡,还是出了内网反而更慢?
- 卡在时延还是丢包?视频画面定格和文件下载中途中断,对应的处理策略完全不同。
- 卡在持续拥塞还是瞬时突发?出口常年跑满,和只在整点批量任务启动时丢几个包,是两种优化思路。
判断方法很直接,在用户侧终端持续ping对端网关,同时用抓包软件记录往返延迟和重传率。如果延迟平缓但重传居高,说明路径中有人丢包;如果延迟周期性飙高,说明有队列在积压,典型的突发拥塞。这一步做扎实了,后面配置QoS才有瞄准的方向。
1.2 QoS不是“加速”,是“排序”:给网络做分级而不是提速
一个从没接触过QoS的人,听到“质量配置”会很自然地以为它能让网络更快。但这个理解需要修正:QoS不增加链路带宽,它做的是在网络来不及转发时,决定谁先走、谁后走、谁可以被丢弃。
这个逻辑跟机场安检通道很像。所有旅客都进同一个闸机口时,VIP走专用通道、普通旅客走普通队列、接驳车走员工通道,通道数量没有增加,但关键人物的通行时间被保障了。再打个更贴切的比方,如果出口带宽是100M,某段时间来了120M的流量,QoS做的就是让视频会议那部分数据走在前面,大文件下载的数据往后放,宁可让下载慢一点,也不能让会议断掉。
所以部署QoS质量配置前,我的建议是把目标量化成一句话:“在100M出口拥塞时,把视频会议延迟控制在50ms以内,把ERP交易成功率保持在99.9%以上。”只有目标明确,后面的策略设计才不会跑偏。
2. 动手前必须想清楚的三个决策点
配置QoS不是把命令敲上去就完事。我在帮客户做网络优化时,习惯先花半天时间梳理三个前置决策,它们的优先级远高于任何一条配置命令。
2.1 信任边界:标记从哪来,能信几分
QoS分级的第一步是给报文打上标记,常见的是IP头里的DSCP字段。但这个标记值可不可以直接采信,取决于你的信任边界画在哪里。
终端设备自己发出的数据包是可以随意修改DSCP字段的,任何用户都可以把自己电脑的流量标记成高优先级。如果在接入层不加甄别地信任所有标记,等于向全网开放了“插队通道”,结果就是高优先级队列被各种想当然的流量塞满,真正重要的业务反而得不到保障。
我设计信任边界的经验是:
- 接入层连普通终端:默认不信任,统一由交换机按业务策略重新标记。
- 接入层连IP话机、视频终端:可以信任设备自身的标记,因为设备厂商的标记规则相对固定。
- 核心层连服务器:可以信任,服务器上业务应用打的标记基本可控。
画好这张“谁有资格打标”的地图,后续的策略才知道该写在哪些设备上。
2.2 方向与瓶颈:QoS部署的位置和模型
第二个决策是搞清楚QoS要放在哪个方向。QoS主要做调度的地方在接口的出方向,因为只有出方向才真正掌握“先发哪个包”的权利。入方向能做到的事情只有分类,可以做限速和丢弃策略,但不能选择“先收谁的包”。
这意味着,如果一条链路的瓶颈在WAN出口上行,那核心策略就应该挂在WAN接口的出方向;如果瓶颈在核心交换机往接入层下行,那策略要挂在核心交换机的下行接口。遇到MPLS或IPSec隧道时,策略往往还要挂到隧道接口,很多人在物理接口配了一堆队列,结果流量走隧道直接绕过去了,策略完全没生效。
另外,别把QoS部署得遍地都是。第一跳设备做分类和标记,中间设备只管转发,出口设备做队列调度,这个层级的职责分离比每台设备都配一堆策略要稳得多。
2.3 优先级策略:把业务分成“必须保”“尽量保”“可牺牲”
第三个决策是业务分级。我通常按四层划分:
- 实时性强、丢包即失败且无法重传的业务,例如语音通话、视频会议,对应DSCP EF,这是绝对优先保障的队列。
- 交互型关键业务,例如ERP下单、财务系统、办公系统,延迟高会影响体验但可以重试,对应DSCP AF21/AF31,属于带宽有保证但并不抢占一切资源的队列。
- 普通办公流量,例如网页、邮件,对应class-default,按剩余带宽调度。
- 可延后的大流量业务,例如系统备份、软件更新、文件下载,建议归入低优先级队列,有空闲带宽就走,忙的时候就等。
这套分层推荐的背后逻辑是:把网络有限的资源优先分给“中断即损失”的业务,让“慢一点能忍”的业务轮候,把“本来就能等”的业务放到最后。
3. QoS核心机制拆解:从标记到拥塞避免的一条完整链路
明确了目标和策略之后,接下来就是把设计落到配置上。QoS的配置链路一般走的是MQC三段式,配合队列调度和拥塞避免机制,才能形成完整闭环。
3.1 MQC三段式:class-map、policy-map、service-policy
MQC的全称是Modular QoS CLI,模块化QoS命令行。它是现代主流网络设备上配置QoS的统一入口,核心是把整个配置过程分成三步:先定义“什么样的流量”,再定义“拿这些流量怎么办”,最后把策略“绑到哪个接口”。
拿日常最容易理解的分类来说,classifier决定匹配条件,比如“DSCP值等于EF的报文”,这个条件可以匹配目标IP、源IP、端口、DSCP标记等单一维度或多维组合。behavior里定义执行动作,比如进哪个队列、限速多少、丢弃策略怎么设。policy把前面两者关联起来,形成一个策略集合。最后service-policy把策略作用于具体接口和方向。
只做标记不调度的配置是QoS里最常见的一类无效配置。相当于给行李贴了VIP标签,但安检口没有VIP通道,标签自然不起作用。
3.2 队列与调度的基本功:LLQ如何保护实时业务
队列调度是QoS的核心执行环节。当流量超过接口带宽时,数据包会被放入不同的队列里,设备按预先配置的顺序和权重把它们发出去。
一类是严格优先队列(PQ),它保证先发完队列里的所有包才发其他流量,对语音视频这类业务极其友好,但代价是,如果掉进这个队列的流量过大,其他业务会被完全饿死。
另一类是低延迟队列(LLQ),本质上是PQ的升级版:它依然保证实时业务优先转发,但目前加了带宽约束,超过预期的流量会被丢弃或降级,避免高优先级队列反过来拖垮全网。这也是为什么我在实战里推荐给视频会议用LLQ而不是裸的PQ。
还有一类是加权公平队列(WFQ)或者按类分配带宽的队列,按权重比例瓜分剩余带宽,适合给ERP这类需要稳定保障但不要求瞬时发送的业务用。把EF丢进WFQ是不合适的,它会跟普通流量一样去和别人抢带宽,实时性无从谈起。
一个完整的接口出方向队列布局可以这样理解:LLQ队列给语音视频,一个或多个AF/CBWFQ队列给关键业务,class-default兜底给普通和后台流量,三个台阶各行其道。
3.3 拥塞避免:WRED丢包的时机艺术
拥塞避免是多数配置里最容易被忽视的环节。队列一旦满了,新到的数据包就只能丢弃,这叫尾丢弃。然而尾丢弃有个问题:当队列持续满时,TCP流会同时丢失大量包,然后集中重传,让网络陷入更长周期的拥塞。这就好比一个非常窄的闸机口,大家都挤着过,一卡就是一大片人摔倒,而不是提前一点点放人往里走。
WRED做的就是把“排队排到满了才丢”变成“快到满时就开始有选择地丢”。它给不同优先级设置不同的丢弃曲线:普通流量在队列深度达到中低水位就开始丢包,让TCP源船降速;高优先级业务的水位阈值高,丢得晚、丢得少,尽量保证关键业务完整到达。
这里有一个常见误区:很多人配置WRED只看平均队列深度的参数,却忘了它只能配在支持WRED的队列类型上,而且需要确认DSCP映射表已经建立。我在设备上见过配了random-detect dscp但匹配表没建,导致所有流量按同一概率被丢弃,关键业务一起遭殃的案例。
4. 实战配置:一个视频会议和文件下载“抢带宽”场景的标准配置
理论铺垫完,进入大家最关心的部分:怎么落成具体配置。我用一个很常见的100M出口场景举例。内网高频使用的业务有三类:视频会议约需10M带宽,ERP约需30M带宽,其余普通办公加数据库同步吃满剩余部分。目标是把视频会议放进LLQ保护起来,ERP进AF队列保证基本带宽,普通流量走class-default争抢剩余资源。
4.1 需求拆解与策略设计
先把需求翻译成一张策略表:
| 业务类型 | 标志位 | 队列行为 | 带宽策略 |
|---|---|---|---|
| 视频会议、语音 | DSCP EF | 进入LLQ,严格优先 | 允许突发到12M,超出则丢 |
| ERP等关键业务 | DSCP AF31 | 进入AF队列,保证带宽 | 保证至少30M |
| 普通办公与后台同步 | DSCP 0(默认) | class-default兜底 | 使用剩余带宽 |
视频会议为什么一边进LLQ一边还要做带宽约束?因为我需要保证它时刻被优先转发,但又不能让它或伪装成它的流量吃掉整条链路。这在配置里体现为LLQ内嵌套的CAR监管,超出允许带宽的包直接丢弃,保护其他业务的基本权益。
4.2 MQC配置的逐步落地方案
以华为VRP系列设备为例,先定义流分类:
traffic classifier VOICE type ip if-match dscp ef然后定义流行为和队列策略:
traffic behavior VOICE queue llq car cir 10000 pir 12000queue llq让该分类的流量进入严格优先的低延迟队列,car对超过12M的突发流量执行丢弃动作,防止LLQ被撑爆。
以同样的思路配置ERP业务:
traffic classifier ERP type ip if-match dscp af31 traffic behavior ERP queue af bandwidth 30queue af bandwidth 30表示该队列为一个确保转发类队列,保证30M带宽,同时允许它在链路空闲时占用更多。
最后组装策略并绑定接口:
traffic policy QOS_OUTBOUND classifier VOICE behavior VOICE classifier ERP behavior ERP interface GigabitEthernet0/0/1 traffic-policy QOS_OUTBOUND outbound解释一下每一步背后的意图:classifier筛出特定流量,behavior执行具体行为,policy把两者的关系绑定,service-policy让它在接口的出方向生效。这样一条链路就把前文中所有设计落到了实处。
思科设备上的等价配置长这样:
class-map match-all VOICE match dscp ef class-map match-all ERP match dscp af31 policy-map QOS_OUTBOUND class VOICE priority 10000 police 12000000 conform-action transmit exceed-action drop class ERP bandwidth 30000 class class-default fair-queue interface GigabitEthernet0/0/1 service-policy output QOS_OUTBOUND4.3 service-policy的方向选择:为什么是出方向
配置绑到接口时,方向选择是很多人容易踩的坑。我在开头提到过,QoS调度的控制点只在出方向,所以上面的策略挂在outbound。入方向这个位置只能做分类、标记、监管,但干预不了“谁先被发送”这个头部顺序。
如果业务瓶颈出现在下行方向,例如分公司通过专线访问总部服务器的数据量很大,那策略要挂在核心交换机连接接入层的接口出方向,而不是在服务器侧入方向拼命配置队列。
4.4 关于标记来源的补充:入方向先做分类和重标记
如果内网设备并不都在源头打好DSCP标记,出方向的调度就没有意义。所以实战中我通常会在接入交换机或网络入口做一次重标记,给关键流量贴上对应DSCP值,再让下游设备基于信任来调度,上游入方向策略长这样:
traffic classifier OFFICE type ip if-match acl 3000 traffic behavior MARK remark dscp af31 traffic policy INBOUND classifier OFFICE behavior MARK interface GigabitEthernet0/0/2 traffic-policy INBOUND inbound这里的ACL 3000按实际办公终端的IP和端口段来写,只对受控终端的ERP应用流量打AF31,未匹配的流量保持默认标记,继续走class-default。
5. 配置完成后的验证与调优:靠数据说话
配置写完到上线,中间还差一个关键环节:验证QoS策略确实在工作。我遇到过不止一次策略挂上去业务感知没有变化的情况,基本都是因为标记没生效、队列没匹配或者接口方向选错。所以养成看统计的习惯非常必要。
5.1 查看命中、丢弃和监管统计
设备维护中,各厂商的命令略有差异,但思路是一致的。华为设备上可以看队列统计和CAR统计,思科设备上则用show policy-map interface一类命令,两头对照着看。
华为上示例:
display traffic-policy statistics interface GigabitEthernet0/0/1 outbound display qos queue statistics interface GigabitEthernet0/0/1 display qos car statistics interface GigabitEthernet0/0/1思科上示例:
show policy-map interface GigabitEthernet0/0/1重点看三类数字:
- 分类器命中包数是否持续增长,如果一直为0,说明匹配条件写错了或者标记没打上。
- 各队列的丢弃计数,如果LLQ的丢弃数异常增加,多半是CAR限制设得太小或者有人大量标记EF流量。
- CAR监管的pass和discard统计,前者代表合法流量,后者代表超出预期被保护的流量,是正常的保护动作。
5.2 让策略在压力下显现效果
常规办公空载时验证不出问题,最好找一个业务低谷窗口人为制造一次带宽压力。我在客户的维护窗口里常用一个简单粗暴的办法:用测试工具同时发起大文件传输和视频会议呼叫,先单独拥塞链路,再看视频会议的数据有没有得到优先转发。
具体操作步骤:
- 用iperf或文件共享向链路两端灌流量,制造接近100%的拥塞。
- 同时发起一路视频通话或实时音视频流,观察延迟、抖动和丢包。
- 重点记录视频流所在队列的命中与丢弃数据。
- 对比开启QoS前后的通话质量指标,验证策略是否按预期调度。
如果实际效果和预期不符,优先排查是不是流量没进入预期队列,再用统计命令复查标记和ACL匹配关系。
5.3 动态调优:让策略跟上业务节奏
QoS调优不是一次性工作。链路带宽、业务比例、峰值时段都会变,我的调优周期一般按季度走。每次调优的要点包括:
- 观察LLQ的CAR丢弃量,如果频繁触发,说明视频会议的真实峰值超过了预设带宽,需要把cir适当上调。
- 观察AF队列的延迟是否长期接近上限,如果是,可以考虑增加它的带宽权重,同时检查是否有其他流量挤占了class-default。
- 观察普通流量队列的丢包特征,如果丢弃集中发生在某些固定时段,跟批处理任务时间对应,可以针对性做时段性QoS策略。
以下是一个时段动态QoS的示意思路:在工作时间执行严格保障策略,下班后放宽视频会议的限速阈值、提高后台同步的带宽上限。这类策略可以通过设备的time-range或者定时策略任务实现,并不复杂。
6. 那些配置QoS时绕不开的坑与我的经验建议
QoS配置本身没多少条命令,但它在真实网络环境中失效的方式五花八门。这一节把我这些年踩过的坑集中整理出来,当作一个即拿即用的检查清单。
6.1 只打标不调度,等于白配
最普遍的问题是把DSCP标记得漂漂亮亮的,却不用队列调度,或者只配了分类器没配behavior。这时候的QoS配置完全是纸面工夫,出方向的报文还是先到先发,没有任何区别。
6.2 信任边界画错,网内用户自己“插队”
我在前面反复强调信任边界的意义,就是因为真实环境里一台接入交换机如果不甄别标记,用户随手把自己的流量改成DSCP EF就能一路插队。这个时候你看到LLQ堆积大量不必要的流量,关键业务反而没有位置了。所以接入层要么重标记,要么把不信任的DSCP字段清零,必须有一条明确的分界线。
6.3 高优先级队列不做带宽约束,全网被一个业务拖垮
这是最严重的设计缺陷之一。LLQ是绝对优先,如果不限速,任何一段代码故障或异常流量涌入EF标记,都会导致其他队列完全饿死。所以我给所有实时业务队列都加了CAR监管,宁可让异常的EF流量丢在接口上被统计出来,也不能让它影响全局。
6.4 把QoS配置在错误的方向或错误的接口
链路的上下行管道可能是双倍带宽,很多人一上来就在WAN入方向配置队列想“优化出流量”,但其实入方向完全起不了调度作用。另外在物理链路和隧道并存的场景,策略要落在实际承载业务的隧道接口或子接口上,物理接口的挂载可能是作用不到的。
6.5 非拥塞状态下过度堆规则
链路利用率平时40%都不到的网络,本身不存在拥塞,配置再精细的QoS也感知不到差别。这种情况下与其堆一堆策略,不如先把监控报警做好,等确实出现拥塞再按预设策略启用QoS。永远记住:QoS是为拥塞而存在的,没有拥塞时它是隐形的。
6.6 部署前先让业务签字
最后分享一个项目里最实际的经验:配置QoS前,先让各业务负责人确认优先级表并签字。QoS本质上是在公开裁决“谁更重要”,如果只凭IT部门自己定优先级,后面大概率会因为某个业务被限速而产生无穷无尽的争执。把业务分类、带宽预期、异常时的降级策略白纸黑字定下来,一次配置评审轻松很多,后续调优也有据可依。
我自己做网络运维这些年,越来越觉得QoS不是一条配置命令,而是一套网络治理的方法论。技术方案一天能写完,业务共识才是真正的难点。下次再有人拿着“网络卡”来求助,不妨先问一句:“这个卡,是排队排出来的吗?”如果是,QoS才是值得投入精力去打磨的东西。