首页 › deep-tech › 每 1 毫秒分一次蛋糕:调度器

标题: 每 1 毫秒分一次蛋糕:调度器 作者: 爱卫生 封面: "[[封面1.png]]" 封面裁剪: false 原文地址: 打开评论: true 仅粉丝可评论: false 摘要: 手机信号满格,网页却转圈;测速能跑500Mbps,刷个页面反而卡住。很多工程师遇到这类投诉,第一反应是查覆盖、查干扰,但还有一层原因藏得更深:空口资源每时每刻都在被“重新分配”,而分蛋糕的那只手,就是基站的调度器。


每 1 毫秒分一次蛋糕:调度器

手机信号满格,网页却转圈;测速能跑500Mbps,刷个页面反而卡住。很多工程师遇到这类投诉,第一反应是查覆盖、查干扰,但还有一层原因藏得更深:空口资源每时每刻都在被“重新分配”,而分蛋糕的那只手,就是基站的调度器。它每毫秒做一次决策,决定这一瞬间谁的データ上路、走哪段频谱、用什么格式。理解了调度器,你才算真正理解QoS不是几张参数表,而是一台每毫秒运转一次的分配机器。

一、空口是一张共享的桌子

先想清楚一个问题:为什么需要调度器?

因为空口是一张所有用户共享的桌子。一个小区的频谱资源就那么多,基站到手机之间的无线电波是广播性质的——基站同时朝八个方向发八路不同的数据,手机之间就会互相干扰,谁也收不清。所以LTE以后的空口设计思路是:把资源切成细小的格子,每一瞬间只让指定的用户占用指定的格子。

这个“格子”在物理上有两个维度:

于是空口变成了一张时间×频率的二维网格,调度器的全部工作,就是每个slot都要回答一遍:这张网格上的每一格,给谁用?

用食堂打饭类比:只有一个打饭窗口(基站),窗口前面挤着一百个学生(用户),阿姨手里的勺子每次只能盛一勺。调度器就是这位阿姨——只不过她每0.5毫秒就重新决定一次“下一勺给谁”,而且她还有一个别人没有的本事:她知道每个学生现在饿到什么程度、消化能力如何。

flowchart TD
    A["核心网送来数据包"] --> B["gNB缓存队列"]
    subgraph S["基站里的调度引擎"]
        B --> C["MAC调度器"]
        C -->|每0.5到1毫秒决策| D["物理层发送"]
    end
    D -->|PRB加调制格式| E["手机UE"]

调度器住在基站协议栈的MAC层,上承RLC的缓存队列,下接物理层的发送器。这个位置决定了它的两个特征:它只看得见毫秒级的当下(谁的数据在缓存里排队、谁的信道此刻好),而慢速级的规则(这个用户签约了什么速率、哪个业务该优先)是核心网通过QoS参数提前告诉它的。调度器 = 长期规则 + 瞬时信息的合成器。

二、调度器手里的牌:它靠什么信息做决策

一个常见误解是:调度器就是“按优先级排序”。实际上排序只是最后一步,调度器90%的功夫花在收集信息上。它每毫秒要综合下面这张表里的牌:

信息 来自哪里 回答什么问题 类比
CQI 信道质量指示 手机周期性上报 这个人现在的信道能扛多大速率? 顾客自报饭量
BSR 缓存状态报告 手机按需上报 上行还有多少数据等着发? 排队人数
SR 调度请求 手机主动举手 有新人要加入吗? 举手喊“阿姨”
PHR 功率余量报告 手机定期上报 手机还剩多少发射功率余量? 顾客还剩多少体力
HARQ 待重传队列 基站自己记录 上一轮谁没收到,要补发? 退回重炒的菜
下行缓存数据量 基站自己记录 下行要给每个人发多少? 备菜量
QoS参数(优先级/GBR等) 核心网会话建立时下发 谁有承诺、谁靠边站? 订过座名单

注意CQI那一行——它同时是自适应调制编码(AMC)的输入。这里要划清两个模块的分工,也是工程师容易混淆的一点:

两者共用CQI,但职责不同。信道好的人被优先选中(调度器的活),选中之后给他配高阶调制多塞比特(AMC的活)。

三、一毫秒的一生:GBR先订座,Non-GBR抢剩余

信息齐了,一次调度决策在基站内部是怎么走的?看这条流水线:

flowchart TD
    A["新slot开始"] --> B["汇总全部输入信息"]
    B --> C["HARQ重传最优先"]
    C --> D["GBR承载按承诺保障"]
    D --> E["剩余PRB按PF度量分给Non-GBR"]
    E --> F["为每个中选用户选MCS"]
    F --> G["PDCCH下发DCI点名"]
    G --> H["数据在分配的PRB上收发"]

这条流水线里藏着QoS设计的精髓:资源被分成了两个性质完全不同的池子。

GBR承载(语音、视频通话这类有速率承诺的业务)相当于提前订了座。核心网在建承载时做过准入控制——基站算过账,确认“这个小区还养得起一张新订座”才放行。准入之后,调度器每个slot都要优先喂饱GBR流,把它们逼近承诺速率,剩下的PRB才拿来自由分配。

Non-GBR承载(网页、下载、普通视频)没有订座,全部挤在剩余资源里“抢座”,谁抢到看算法(下一节讲)。两者的待遇差异可以浓缩成一张表:

维度 GBR承载 Non-GBR承载
进入小区 需要准入控制,满了会被拒绝 随到随用
速率下限 有承诺速率,调度优先保障 无下限,纯尽力而为
速率上限 有峰值限制封顶 受会话级/终端级总闸封顶
拥塞时 最后被挤,尽量维持承诺 最先被压缩
限速执行位置 空口调度器逐毫秒执行 会话总闸多在核心网UPF执行,终端总闸由基站配合
典型业务 VoNR语音、视频通话 网页、下载、流媒体

最后两行值得多说一句,因为它解释了一个经典的现网困惑:为什么有的限速在基站侧怎么调都不生效?因为速率控制是两级执行的。逐毫秒的“保与抢”发生在空口调度器,而“你这个会话总共不超过200Mbps”这类慢速总闸,大多在核心网UPF上执行——那是计费和签约层面的闸,跟空口挤不挤没关系。排障时先分清“限速来自哪一级”,能少走很多弯路。

还有一个细节体现工程智慧:GBR流内部也不是“优先级高者通吃”。高优先级流喂到承诺速率后,调度器会让位给其他GBR流——承诺的本质是“保证不低于”,不是“越多越好”。订座的人吃完了,座位自然让给下一批订座的。

四、上行的举手礼:SR与BSR的接力

下行好办——数据都在基站自己缓存里,调度器想看随时看。麻烦的是上行:数据在手机里,基站看不见。手机不能“想发就发”,一是上行功率金贵、多用户要集中管控,二是基站需要全局视野才能避免干扰。于是上行设计了一套轻巧的“举手—点名—报数—发糖”流程:

sequenceDiagram
    participant U as 手机UE
    participant G as 基站gNB
    U->>G: SR举手:我有数据要发
    G->>U: 小块授权:先给你一点
    U->>G: BSR报数:缓存里还有X字节
    G->>U: 大块授权:按你的量给足
    U->>G: 数据真正发出
    Note over U,G: 完整往返通常耗时数毫秒

这套流程里有三个精巧的设计,值得工程师记住:

第一,SR只有1比特。举手不需要说明要多少资源,只表达“我饿了”。这是一个信息效率的典范——最小的信令开销,触发最小的初始授权。手机在专用资源上发SR;如果连续举手超过上限次数还没被理睬(比如专用资源信号太弱),手机会退回到随机接入流程去“大声喊”,代价更大但保证不死锁。你在现网日志里看到上行数据前的异常随机接入,很多时候就是SR路径失效后的兜底动作。

第二,BSR按“频道组”打包上报。手机里可能同时活跃着十几条逻辑信道(语音的、信令的、上网的),逐条上报太浪费。于是标准把逻辑信道归并成最多8个逻辑信道组(LCG 0到7),BSR只报每个组里排队的总字节数,而且报的是量化后的档位而非精确值。多个来源的协议教程均确认了这一机制:ShareTechnote的BSR格式图里明确画着LCG0到LCG7的字段,ranbits的调度教程也指出“gNB用BSR决定下次给多少RB”。所以基站第二次发的授权才能“按量给足”。

第三,手机里还藏着一个镜像调度器。基站给了授权,手机内部也要决定:这点资源先发给谁?这就是逻辑信道优先级(LCP)机制——每条逻辑信道配一个优先发送速率(PBR)和一个令牌桶,令牌按PBR的速率持续进账:

$$B_j(t+\Delta) = \min\bigl(B_j(t) + \mathrm{PBR}_j \cdot \Delta,\; \mathrm{BSD}_j \times \mathrm{PBR}_j\bigr)$$

有授权时,先按优先级从高到低,把桶里有令牌的信道喂到令牌用完,剩余资源再按严格优先级分给其他信道。这个设计的妙处在于令牌桶给低优先级信道留了活路:哪怕小区里永远挤着高优先级业务,低优先级信道也能按PBR的节奏定期分到一口饭,不会彻底饿死。

flowchart TD
    A["收到上行grant"] --> B{"高优先级桶里有令牌吗"}
    B -->|有| C["先发它直到令牌耗尽"]
    B -->|无或已耗尽| D["按优先级顺序用剩余资源"]
    D --> E["低优先级靠令牌桶定期吃到饭"]

所以“调度”其实发生两处:基站的调度器分PRB,手机的LCP分grant。排障时看上行异常,两头都要看。

五、公平与效率的跷跷板:调度算法的思想史

Non-GBR流量在剩余资源里怎么分?这才是调度算法真正的战场。三种经典思路,代表了三种价值观:

算法 规则 小区总吞吐 公平性 类比
轮询 RR 挨个轮流,不看信道 低 绝对公平 排队打饭不看饭量
最大C/I 谁信道好就全给谁 最高 边缘用户饿死 只招待最有胃口的人
比例公平 PF 瞬时可得速率除以历史平均,商最大者得 接近最高 时间上趋近平等 谁最近没吃上就照顾谁

轮询和最大C/I是两个极端,而现实网络几乎都用比例公平(PF)——它诞生于3G时代的HDR(EVDO)系统,此后一直是蜂窝数据调度的默认哲学。PF的决策量非常简洁:

$$P_i(t) = \frac{r_i(t)}{\bar{R}_i(t)}$$

其中 $r_i(t)$ 是用户 $i$ 此刻信道能支撑的速率(由CQI推算),$\bar{R}_i(t)$ 是它过去一段时间的平均吞吐。每次传输后按滑动窗口更新:

$$\bar{R}_i \leftarrow \left(1-\frac{1}{T_c}\right)\bar{R}_i + \frac{1}{T_c}\,r_i$$

这个除法的直觉极妙:信道好(分子大)的人优先,但最近一直没被服务(分母小)的人补偿。站在信号好的用户,他信道好、分子大,容易中选——这利用了无线信道的随机涨落(“多用户分集”);但每次中选后他的平均吞吐上涨、分子相对变小,别人就有机会顶上。某百科的条目给出了更一般的表达式 $P = T^\alpha / R^\beta$,并指出:$\alpha$ 越大越偏向“只伺候信道最好的”,$\beta$ 越大越偏向绝对平均,取 $\alpha \approx 1, \beta \approx 1$ 就是3G网络里实际使用的比例公平。条目还提到一个工程细节:平均窗口常数 $T_c$ 越大,总吞吐越高、短期公平性越差——这是现网参数优化时真实存在的旋钮。

打个比方:雨夜打车。最大C/I策略是“谁站在马路中间最好拦就只接谁”,效率最高但住巷子里的人永远打不到车;轮询是“严格排队,哪怕你绕路三公里也要拉”;PF是“谁最近一直没打到车、现在又恰好站在好拦的位置,就接谁”——总单量不亏,人人有车坐。

六、不举手的传输:动态调度的代价与捷径

SR→grant→BSR这套动态调度很灵活,但它有两个成本:时延(一轮握手要好几个毫秒)和开销(每次点名都要占控制信道)。对于每20毫秒就要发一个语音包的VoNR、或者时延要求卷到亚毫秒的URLLC业务,每包都举手报到,既慢又贵。

解决方案是“包月专线”:半静态调度/预配置授权。网络通过信令一次性告诉手机:“以后每个周期,这个时间这个资源就是你的,不用再举手。”语音业务的包是周期性、大小可预估的,天然适合这种模式;URLLC更依赖它来把调度时延从流程中整个砍掉。代价是灵活性——资源被预占了,别人用不了。所以现网的经典搭配是:语音/URLLC走专线,普通数据走每毫秒的动态拍卖。

这也就解释了抓包时的一个现象:语音包的上行传输前看不到完整的SR/BSR握手,不是抓包漏了,是它根本不走那条路。

七、现网连接:这些知识在哪里用得上

场景一:测速正常,网页转圈。测速是大流量长连接,吃满调度资源毫不含糊;网页是“请求—响应”的小包往返,每一次上行请求都要走一遍举手流程。如果SR资源紧张、或BSR触发的授权节奏偏慢,小包业务的首包时延会被显著拉长,而吞吐类业务毫无察觉。这时该看的是调度相关的时延统计,而不是盯着下行吞吐找问题。

场景二:语音MOS忽高忽低。先查语音承载是不是还“订着座”。承载降级成Non-GBR(比如承载修改异常、拥塞导致被挤),语音包立刻掉进PF的公开竞技场,和下载流量抢PRB,抖动和丢包随之而来。确认方法很直接:看该承载是否还带GBR属性、调度统计里它的速率是否贴着承诺值。

场景三:用户投诉“被限速”,但空口很空。大概率不是调度器的事。先查会话级总闸(UPF侧限速)和终端级总闸(签约AMBR),再看空口——顺序反了会白忙半天。空口资源占用率低而用户速率被卡死,基本可以断定闸在核心网。

场景四:某类业务高峰期集体劣化。查优先级配置有没有倒挂——如果把关键业务配了比视频更高的5QI优先级之外,还有大量业务被错误地配成了同档高优先级,“高优先级”等于没配,全员挤在第一梯队互相踩踏。优先级是相对概念,人人都 VIP 就没有人是 VIP。

最后纠正三个常见误解:

  1. “GBR承诺的速率是物理保证”——不是。准入控制和调度优先级只是统计意义上的保障,用户站在小区边缘信道恶化时,承诺速率照样达不到。GBR是“排程保证”,不是“物理定律”。
  2. “优先级高可以抢光资源”——不是。PBR/令牌桶机制给高优先级设了上限,吃够份额就得让位,这是给低优先级留的活路。
  3. “调度器就是排序算法”——不是。排序只是一毫秒里的最后一环,CQI/BSR/PHR这些信息采集机制才是地基。信号采集断了,再好的算法也是瞎猜。

常见问题

Q: 调度器和自适应调制编码(AMC)是什么关系? A: 分工是“选人”与“选格式”。调度器决定这0.5毫秒把哪些PRB给哪个用户;AMC决定被选中的用户用什么调制阶数和码率。两者都以CQI为输入,但CQI给调度器的用途是“比较谁更值得”,给AMC的用途是“算这个人能扛多大码率”。

Q: 为什么上行不能像WiFi那样想发就发? A: WiFi的CSMA/CA是分布式“抢话筒”——听到没人说话就抢,抢撞了退避重来。这套机制天然无法提供精细的QoS承诺,因为你永远不知道下一刻谁会抢到。蜂窝网的集中式调度虽然多了一次举手开销,但换来的是每毫秒的确定性分配——GBR、优先级、切片保障,全都建立在“基站说了算”之上。这是两种体制的根本分野。

Q: 手机内外的两个调度器(gNB调度器和LCP)会打架吗? A: 不会,它们是上下游。gNB决定“给多少”,LCP决定“先发谁”。LCP通过PBR和令牌桶维持每条逻辑信道的最低节奏,剩余资源按严格优先级分配——它像是基站在手机里安插的“政策执行人”,保证资源到了手机端仍按QoS规则分流。

Q: 比例公平是不是绝对公平? A: 不是。PF保证的是长期时间公平(每个用户的平均吞吐在时间轴上趋于平等),而不是每个瞬间的资源均分,也不是速率相等。小区边缘用户和小区中心用户的实际速率差距依然很大——PF只是保证边缘用户也能获得“属于他的那份时间”,不至于被饿死。

Q: 排障时如何快速判断问题出在调度层? A: 记住三条证据链:看调度统计里各承载/各QoS等级实际分到的PRB比例(分不到=调度层受限);看SR失败计数和随机接入原因(举手失败=上行信令路径问题);看GBR承载速率是否贴近承诺值(贴不上=保障失效或覆盖问题)。三条分别对应“分蛋糕不公”“举不起手”“订了座没饭吃”三种典型病。

参考来源

  1. 5G NR MAC Buffer Status Report (BSR) - 3GLTEInfo — BSR用途、四种格式与逻辑信道组上下文
  2. 5G NR MAC Scheduling Request (SR) - 3GLTEInfo — SR的MAC层机制、与BSR/授权/DRX的联动
  3. 5G | ShareTechnote - BSR格式 — Long BSR格式图中LCG0至LCG7的字段划分,证实NR的8个逻辑信道组设计

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

![[知识星球二维码.png]]