
这几年我经手过的网络故障里因为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-policyMQC的全称是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才是值得投入精力去打磨的东西。