
简介《通信网基础 第7章 排队论的基本概念》是一份面向通信工程及相关专业学生的基础理论PDF系统讲解排队论在通信网中的核心地位。内容从排队系统四要素——到达过程、排队结构、排队规则与服务过程出发详细介绍了泊松流、负指数分布等概率模型并覆盖M/M/1排队系统的分类、主要性能指标及典型应用场景如电话网、计算机网络与交通流分析。资源为单份PDF电子文档大小4.6MB便于随时查阅。目前已有201人学习该资料适合正在学习通信网基础、需要快速把握排队论框架的读者。借助本章清晰的图示和例题读者可理解顾客到达与服务时间等随机过程的建模思路为后续深入理解网络性能分析打下扎实基础。1. 排队论不是数学作业而是定位时延问题的第一张工程图纸前一阵排查一台汇聚设备的转发时延问题接口流量、CPU、内存全部正常业务侧偏偏喊卡。最后把《通信网基础》第7章排队论的基本概念打开按M/M/1模型把出接口队列算了一遍才发现利用率已经爬到0.82时延正处在指数上升区。那一刻才意识到排队论不是期末考试里的数学作业而是通信网络工程师手里少有的定量图纸。它能把“拥塞”拆成到达率、服务率、队列长度和等待时间四个可测可算的量让你在设备开始丢包之前就预判风险。这篇笔记写给正在学通信网基础的学生也写给被时延和丢包反复折腾的运维与开发目标是让你把这一章变成可复现的排障手段。2. 排队系统三要素到达、服务与排队规则先分清再建模任意排队系统都可以拆成三个部分顾客怎么来、服务台怎么干活、服务台忙的时候新顾客怎么办。通信网里顾客是分组或报文服务台是出接口或链路排队规则对应设备里的调度和丢弃策略。三要素没对齐之前公式填进去全是错的。2.1 到达过程泊松到达为什么是通信网分析的默认起点到达过程描述的是顾客进入系统的规律通信网里最常见的是“泊松到达”。泊松过程满足三条性质在任意固定时长内到达数服从泊松分布相邻到达间隔服从指数分布已经等待的时间不影响未来还要等多久也就是无记忆性。这三条性质让数学推导变得很干净所以教材第7章一定会先讲它。工程上怎么用最简单的方法是取一台设备的接口计数器连续读两次计数器的差值除以时间间隔得到“每秒到达报文数”这就是到达率λ。注意λ的单位必须是“个/秒”不能拿带宽比特数直接填否则后面所有公式都会乱。如果你想自己验证泊松到达长什么样可以用以下Python脚本生成一组到达序列import numpy as np lambda_rate 100 # 平均每秒到达100个报文 n 1000 # 生成1000个到达间隔 # 泊松过程的到达间隔服从指数分布均值 1/lambda_rate inter_arrival np.random.exponential(scale1.0 / lambda_rate, sizen) arrival_times np.cumsum(inter_arrival) print(arrival_times[:5]) # 前5个报文的绝对到达时刻逻辑说明np.random.exponential 生成的是指数分布随机数scale参数写成 1.0/lambda_rate 是因为指数分布均值等于1/λ。把间隔累计求和就得到每个报文的绝对到达时刻。如果打印结果越来越稀疏或越来越密那不是程序错了而是随机波动取1000个以上的样本平均间隔就会收敛到0.01秒。参数说明lambda_rate是平均到达强度值越大代表每秒钟到达的报文越多生成的间隔越小。这个脚本只负责模拟到达侧还没有服务台。实际抓包时你可以从pcap里提取时间戳用相邻时间戳的差值得到到达间隔再做同样统计。边界要清楚泊松到达不是万能的。当流量来自少数几条大流、TCP的突发窗口、定时器控制的周期上报时到达间隔会“成簇”也就是一阵密集一阵稀疏变异系数大于1。这时候再用泊松假设排队长度会被明显低估。后面第四章会给一个粗糙但可用的近似修正。2.2 服务时间与服务台数量从指数分布到确定性服务服务时间是服务台处理一个顾客所需的时间通信网里它约等于“报文长度除以链路速率”。一个1000字节的报文在1Gbps链路上发送服务时间大约8微秒。如果报文长度随机服务时间就是随机变量。教材中的M/M/1模型假设服务时间服从指数分布也就是短报文多、长报文少且无记忆。这个假设和变长IP分组比较接近是默认的保守模型。另一种常见情况是定长帧比如某些系统按固定长度封装转发服务时间基本是常数对应D服务这时候排队会明显更短因为不会出现一个超大报文把后续报文都堵住的现象。服务台数量c也要先定下来一个物理出接口就是单服务台多个链路做负载分担则要按多服务台看。多服务台时利用率是ρλ/(cμ)而且必须满足λcμ才有稳态解。很多人在这一点上翻车明明有两条链路却用总带宽算服务率忽略了负载分担不均导致实际单链路已经过载另一个却闲置。用A/B/c三段表示法可以快速描述一个排队模型A段写到达过程B段写服务时间分布C段写服务台数量。M表示指数分布D表示定长G表示一般分布。常见的M/M/1就是泊松到达、指数服务、单服务台M/D/1是泊松到达、定长服务、单服务台G/G/1是完全用实测分布建模的单服务台。通信网教材里绝大多数公式围绕这三种展开。组件典型场景服务时间均值对排队的影响M指数变长IP分组1/μ方差大排队偏长D定长定长信元/固定帧1/μ方差为0排队偏短G一般实际业务测量由分布决定需要用变异系数修正表里的“影响”是定性结论同样的平均服务时间服务时间越随机排队越容易累积。这就是为什么交换设备需要大缓存去吸收突发而TDM管道几乎不需要排队。2.3 排队规则丢弃、等待与优先级对性能的影响第三个要素是顾客到了之后怎么排队。最简单的规则是先到先服务也就是FIFO设备接口默认队列通常就是它。FIFO模型下只要队列不满全部顾客按到达顺序被服务队列满了新到的报文被丢弃也就是尾部丢弃。还有一种常见规则是优先级队列。高优先级报文永远先被服务低优先级报文要等所有高优先级报文处理完才能轮上。从排队论角度这相当于把原队列拆成两个队列高优先级的等待时间很小低优先级的等待时间可能大幅恶化。这不是设备bug而是调度策略的取舍设计QoS时要分别建模不能直接把所有业务混在同一个M/M/1里算。加权公平队列、随机早期检测属于更复杂的调度和丢弃策略。加权公平会按权重分配服务容量让每个流都有基本保障随机早期检测则在队列还没满时就开始随机丢包用来避免TCP全局同步。对基础概念来说你只需要知道一点同一套到达率和服务率换一种排队规则平均时延、丢包位置都会变。落地动作很具体先登录设备看接口队列配置。如果是默认FIFO就用标准排队公式如果配置了多个队列就要按队列优先级把流量分类每个队列单独计算。我一般会先把队列规则截图存档再开始建模因为很多系统里看似“接口流量正常”其实是低优先级业务已经被压到超时边界。3. 用系统队长关系和M/M/1模型算时延一个能落地的计算流程3.1 系统队长关系NλT是最快估算缓存需求的公式在所有排队论结论里最值得先记住的是系统队长关系稳态下一个排队系统内部的平均顾客数N等于到达率λ乘以顾客在系统里的平均逗留时间T。写成公式就是NλT。这个关系不要求到达过程服从泊松也不要求服务时间服从指数只要系统能稳定运行它就成立。所以在不确定业务模型的时候它是最先能用的“黑匣子”公式。工程用法分两种。一种是从指标反推已知某设备平均队列长度25个报文到达率500个/秒那报文平均逗留时间就是25/5000.05秒也就是50ms。这里的队列长度如果是设备里缓存的报文数结果就是报文从进入队列到离开链路的时间另一种是从预算正推如果某类业务要求平均时延不超过20ms到达率是300个/秒那么队内缓存不能低于6个报文。用这个公式时唯一要注意的是单位统一。λ用“个/秒”T用“秒”N就是“个”。如果λ取的是MbpsT取的是毫秒N就会变成没有意义的数字。我习惯在算之前先把所有流量都换算成“报文/秒”再代入。3.2 M/M/1模型的四个必用公式与参数边界M/M/1是单服务台、泊松到达、指数服务、无限缓存的排队模型。它的关键参数是到达率λ和服务率μ模型能稳定的条件是λμ。教材里给出的四个公式是利用率ρλ/μ 平均等待队长Lqρ²/(1-ρ) 平均排队等待时间Wqρ/(μ(1-ρ)) 平均系统逗留时间W1/(μ(1-ρ))。还有一个经常用到的衍生量系统内平均顾客数Lρ/(1-ρ)注意它等于Lqρρ是正在服务台里的那个顾客的占比。Wq对应的是“排队等待的时间”W对应的是“排队加服务总时间”两者相差1/μ也就是平均服务时间。符号含义单位取值范围λ单位时间到达的顾客数个/秒0到正无穷μ单位时间能服务的顾客数个/秒大于0ρ利用率或服务强度无量纲必须小于1Lq平均等待队长个随ρ增大而增大Wq平均排队等待时间秒ρ越接近1越大W平均系统逗留时间秒Wq1/μ边界条件必须盯住ρ1。ρ等于1时队列长度理论上是无穷大所有设备都会开始丢包ρ超过1排队系统不稳定公式会给出负数或无穷大说明设备正在过载。工程上通常把运行点压在ρ0.5到0.7之间不是因为0.8不能跑而是因为0.8之后的时延曲线斜率已经很陡。ρ从0.5提升到0.7Wq从1倍服务时间涨到约2.33倍从0.7到0.9Wq从2.33倍涨到9倍。可以看到越靠近1同样的流量增幅带来越大倍数的时延增长。3.3 一个Python算例交换节点出接口排队时延的完整计算下面这个场景很常见接入交换机上行口是1Gbps平均报文长度1000字节实测流量700Mbps。我们要算这个出接口的排队指标。先换算到达率和服务率。700Mbps除以8得到字节速率再除以1000字节得到每秒到达报文数也就是λ87500个/秒。1Gbps同样换算得到μ125000个/秒。代入公式ρ0.7。# M/M/1 出接口排队指标计算 mu 125_000.0 # 服务率1Gbps / 8bit / 1000byte 125000 pps lam 87_500.0 # 到达率700Mbps / 8bit / 1000byte 87500 pps rho lam / mu # 利用率或服务强度 Lq rho**2 / (1 - rho) # 平均等待队长 Wq rho / (mu * (1 - rho)) # 平均排队等待时间单位秒 W 1.0 / (mu * (1 - rho)) # 平均系统逗留时间(排队发送)单位秒 print(f利用率 rho: {rho:.3f}) print(f平均等待队长 Lq: {Lq:.2f} 个报文) print(f平均排队等待 Wq: {Wq*1000:.3f} ms) print(f平均系统逗留 W: {W*1000:.3f} ms) # 验证 N lam * W N lam * W print(f校验 Nlambda*W: {N:.2f} 个报文等于 rho/(1-rho){rho/(1-rho):.2f})逻辑说明脚本先由λ和μ算出ρ再分别算Lq、Wq、W。最后用系统队长关系做一次自检λ×W的结果应该等于ρ/(1-ρ)如果不一致说明单位换算或公式有误。输出结果里ρ0.7时Lq约1.63个报文Wq约0.0187msW约0.0267ms。看起来很小但这是平均值。参数说明mu和lam的单位必须都是“个/秒”。如果把lam写成700Mbps整个模型就会失效。改流量时可以先把期望流量换算成pps再改lam例如流量变成900Mbps时lam112500ρ0.9重新运行会发现Wq变成约0.072ms是0.7时的3.85倍而Lq从1.63涨到8.1个。这就是为什么网络设计宁可让链路利用率留余量也不要在0.9附近赌平均值。提示上述计算假设单条GE链路独立发送。如果接口是链路捆绑μ要按捆绑后的总带宽算并且评估负载分担是否均匀分担不均时实际单链路ρ可能比理论高很多。4. 从M/M/1到M/D/1与G/G/1不同业务模型下的排队指标对比4.1 服务时间的随机性如何影响排队长度M/D/1 vs M/M/1M/M/1假设服务时间服从指数分布但在很多通信系统里服务时间其实接近常数。例如定长帧交换、TDM时隙转发或者某种封装协议把不同业务切成相同长度再发送。这时用M/D/1更合适它的平均等待队长公式是Lqρ²/(2(1-ρ))正好是M/M/1结果的一半。原因可以从直觉理解服务时间有随机性时一个超长报文会把后续已经到达的报文全部往后推而服务时间恒定时顾客之间的影响只来自到达间隔随机性。所以同样的平均服务时间方差越大排队越长。这是个通用结论真正影响排队的不只是平均值还有分布形状。我们在同一服务率下对比一下单位个报文利用率 ρM/M/1 LqM/D/1 Lq0.50.500.250.71.630.820.98.104.05可以看到利用率越高两者差距的绝对值越大。所以如果业务包长极其稳定用M/M/1会过度设计缓存但如果把M/D/1用在变长IP业务上缓存大概率不够用实际时延会超出预期。怎么判断该用哪个最简单的方法是抓一段包长分布如果包长集中在少数几个固定值服务时间方差小M/D/1更接近如果包长从64字节到1500字节都有M/M/1更保守。通信网基础里把这两个模型放在一起就是想让你先看方差再选公式。4.2 G/G/1的近似估算当到达不是泊松时怎么办现实网络流量很难严格满足泊松到达尤其是互联网业务TCP窗口导致突发视频帧周期性到达监测数据按固定间隔上报。到达间隔的分布不再是指数Ca²到达间隔变异系数的平方可能大于1。G/G/1没有通用的精确公式工程上常用一个近似Wq的估计值等于M/M/1的Wq乘以(Ca²Cs²)/2其中Ca²是到达间隔的变异系数平方Cs²是服务时间的变异系数平方。对M/M/1来说Ca²1Cs²1乘完还是1和原公式一致如果Ca²2Cs²0.8排队等待就会放大到原来的1.4倍。这个近似没有严格证明但在中等负载下和仿真结果比较接近是排障时快速修正模型的手段。计算Ca²需要实测数据。假设你抓到了n个报文的到达时间戳可以这样处理import numpy as np # arrivals 是报文到达时间戳数组单位秒 # 自己抓包后按时间排序填入即可 arrivals np.array([0.000, 0.012, 0.019, 0.034, 0.038]) inter_arrival np.diff(arrivals) # 到达间隔 ca2 (np.std(inter_arrival, ddof1) / np.mean(inter_arrival)) ** 2 print(fCa2 {ca2:.2f})逻辑说明先用相邻时间戳求差得到到达间隔序列再算标准差与均值的比平方就是变异系数平方Ca²。如果结果接近1说明泊松假设基本可用如果明显大于1说明到达有突发性需要用G/G/1近似或仿真重算。参数说明ddof1表示样本标准差样本量最好大于1000否则Ca²的波动很大。服务时间Cs²也可以用同样的方法统计用每个报文的长度除以链路速率得到服务时间序列再求变异系数平方。举个例子某设备实测Ca²2.5服务时间接近指数分布Cs²1ρ0.7μ125000。M/M/1的Wq约0.0187ms近似后Wq(2.51)/2*0.01870.0327ms比原先估计高75%。这说明突发影响不可忽略。如果Ca²继续涨到5排队时间会翻3倍此时更应该靠流量整形或增大带宽来降ρ而不是只加缓存。4.3 模型选型对照表与参数调整方向业务千差万别但排队论模型的选型可以按表快速判断业务场景到达特征服务特征推荐模型说明传统电话话务泊松近似好通话时长指数分布M/M/1经典教材场景定长信元转发泊松近似好定长服务M/D/1缓存需求较小互联网突发数据自相似、成群到达包长重尾G/G/1近似需要把Ca²算出来周期上报业务定时到达定长/固定服务复杂模型或仿真泊松假设不适用不能硬套这张表的核心思路先量化到达和服务两者的随机性再决定用哪个模型。通信网基础第7章把M/M/1作为主干不是因为现实中到处都是M/M/1而是它给出了比较基准所有更复杂的模型都要回到这个基准上修正。参数调整方向也可以从公式里直接看出来降ρ是效果最显著的手段。把利用率从0.9压到0.7M/M/1的Wq能下降约75%减小Ca²也有类似效果做法是限速、整形或在入口做流量缓存。最后增加服务台数量也可以降低ρ但要注意负载分担算法是否能把流量均匀铺到每个服务台上。提示近似公式在ρ超过0.8以后会偏乐观建议在0.9以上的高负载区域用离散事件模拟核对不要只靠一个近似数拍板。5. 排队论落地的五个常见坑现象、原因与排查方法5.1 到达率口径不一致导致利用率算到1以上现象设备监控显示接口入方向流量700Mbps平均包长1000字节算出来λ87500个/秒ρ0.7看起来没问题。但实际设备在高峰期已经出现丢包把接口计数器的Rx Count差值除以采样周期得到λ是98000个/秒ρ约0.78已经逼近危险区。原因带宽除以包长时用的是IP包长度没算二层封装和线速开销。以太网上每帧还要加MAC头、CRC、前导码和帧间隙1000字节的IP包实际在线路上占用的长度超过1000字节所以同样带宽下的实际帧率更高。解决不要用带宽除以平均包长计算λ。直接取设备端口计数器两次读值的差除以采样时间得到每秒实际接收报文数。采样间隔建议至少30秒避免瞬时波动。如果只能拿到流量和包长统计就要除以封装后的帧平均长度并加入7%到8%的线速开销系数。5.2 忽略业务自相似性直接把非泊松流量当泊松算现象M/M/1算出来Wq只有0.02ms监控系统却记录到某些时刻的排队时延超过200ms。原因抓包统计的到达间隔变异系数Ca²远大于1流量以突发簇形式到达局部到达率远超平均值。泊松到达适合大量独立用户叠加的场景而视频会议、TCP大流、周期推送都容易形成成簇到达。解决先用抓包数据算Ca²。Ca²在1.2以内泊松假设还能忍超过2就要用G/G/1近似把Wq放大超过5建议做一次离散事件仿真否则任何公式都可能严重低估峰值排队。5.3 平均等待时间和平均逗留时间混用现象设备厂商报告里写“平均转发时延0.02ms”业务侧测试端到端却多出0.04ms两边对不上。原因一边用的是Wq只算排队时间另一边用的是W排队加发送时间。在排队论里这两个概念差一个平均服务时间1/μ报文越大、链路越慢差得越明显。解决写结果时先标清楚符号。如果面向用户感知应该用W如果只评估接口缓存压力用Wq。需要换算时直接加一个1/μ就行。例如μ1250001/μ0.008ms在ρ0.9时Wq0.072msW0.080ms差10%不算小。同理Lq和L也差一个ρ代表正在被服务的那一个顾客。5.4 有限缓冲区直接套用无限队列公式现象某个设备队列缓存只能容纳50个报文用M/M/1无限队列算出Lq8.1个判定不会丢包但实际每秒丢了几百个。原因无限队列公式假设缓存永远装得下而真实设备缓存满了就丢包。有限缓存下的丢包率要按M/M/1/K模型算当系统总容量为K时稳态丢包概率π_Kρ^K(1-ρ)/(1-ρ^(K1))。这里K包含正在服务的那个报文如果缓存是50个系统容量可能要写51或按教材定义确认。计算示例ρ0.9K50丢包率约0.05%看起来不高但ρ0.99时同一K的丢包率会跳到1.5%左右每秒丢上千个。解决算完Lq之后再补一步丢包率计算。缓存越小ρ越接近1丢包概率对K越敏感。可以用下面这段快速估算rho 0.9 K 50 # 系统容量含正在服务的报文 pi_K (rho**K * (1 - rho)) / (1 - rho**(K 1)) print(f丢包率 pi_K {pi_K*100:.3f}%)逻辑说明这是M/M/1/K稳态下系统满的概率也是新到达报文被丢弃的比例。它只在λμ时使用如果ρ1队列持续增长丢包率取决于溢出窗口常规公式失效。参数说明K从1开始取K必须大于1系统容量和“队列深度”的单位要一致否则结果差一个指数位。5.5 用平均值掩盖时延抖动现象平均排队时延只有0.02ms视频会议仍然卡顿因为P99时延已经超过2ms。原因M/M/1给出的是平均值不是上限。等待时间超过t的概率在M/M/1下是ρ×e^{-μ(1-ρ)t}即使均值很小也总有一部分报文会排很久。解决把“平均值分位数”一起看。例如μ125000ρ0.9t0.5ms时超过概率约0.17%相当于每秒有约190个报文排队超过0.5ms。对视频这种对时延抖动敏感的业务这个尾部概率就是卡顿的根源。需要时用这个公式反推给定时延阈值和可接受超标比例算出需要把ρ降到多少。这样才算把排队论用到位。提示这五个坑单独看都不复杂真正玄学的是它们叠加出现。每次排障先统一单位再确认模型假设最后看一眼尾部概率基本能绕开90%的误判。6. 三个验证技巧把排队论公式变成自己的排障工具6.1 先做量纲自检每个结果都能被另一个公式验证算出W后立刻用NλT验证λ×W应该等于ρ/(1-ρ)。如果不相等先检查λ、μ、W的单位再检查是否把Wq当成了W。我一般会把Lq、Wq、W、L四个值列在一张表里写清楚单位最后做一次代入几秒钟就能发现“公式没错但参数填反”的情况。6.2 用一段时间的计数器平滑毛刺不要用仪表盘上的瞬时速率算λ因为瞬时值会把排队模型带入“假过载”。正确做法是连续取10次接口计数器每次间隔30秒取增量差值求平均到达率。这样得到的λ代表稳态运行点而排队论公式算出的本身就是稳态平均值。6.3 画一张“利用率-时延”曲线直观看到膝盖点用Python生成一行数据就够了for rho in [0.5, 0.6, 0.7, 0.8, 0.9, 0.95]: wq rho / (1 - rho) # 以平均服务时间为单位 print(f{rho:.2f}: Wq {wq:.2f} * 1/mu)逻辑说明Wqρ/(μ(1-ρ))把它写成(ρ/(1-ρ))×(1/μ)就得到一个只看利用率的变化曲线。输出会显示ρ0.7时Wq2.33倍服务时间ρ0.9时9倍ρ0.95时19倍。这个曲线就是规划的膝盖点0.7以后每增加一点流量时延都在加速恶化。这三个技巧我只会在真正算过几次之后才用顺。早年间给某项目做缓存规划只看平均值不加余量结果上线高峰期直接翻车。后来养成习惯先算NλT再对Ca²最后看尾部概率才把排队论当成一件顺手的工具。希望帮到你。本文还有配套的精品资源点击获取