周六晚七点,长沙老街上一家湘菜馆人声鼎沸。后厨里,总厨刘师傅面对六口灶台、一眼蒸锅和一台烤箱,手里攥着厚厚一沓菜单。他说了一句让徒弟们记了十年的话:“菜不是一道道做的,是一波波做的——锅够多,就同时开火;火候不同,就错峰占灶。” 这家店的翻台率,比隔壁同样客人流量的馆子高出四成。这不是魔法,而是调度。 机器学习实验的管理,和这间后厨一模一样。你的团队有一堆“菜品方案”等待验证——不同的超参数、不同的网络结构、不同的数据增强策略,每一样都是一道菜,做完才算知道好不好吃。如果一道一道来(串行实验),时间成本高到无法接受;如果无脑全下锅(盲目并行),灶台不够、抢锅打架、管理混乱,反而更慢。所谓实验并行管理,就是学刘师傅那样:在有限的 GPU 算力(灶台)上,决定哪些实验同时开火、谁先谁后、资源怎么分、依赖怎么排、冲突怎么解,并用量化指标不断证明这套调度方案真的更快更省。
掌握实验并行管理,是 AI 工程团队从“小作坊手工跑实验”走向“工业化研发流水线”的分水岭。对 AI 从业者而言,这是一项能直接提升团队研发吞吐量、可量化降本增效的工程硬实力。
可视化演示
动态演示实验并行管理的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
实验并行管理:并行实验 并行实验调度策略设计 计算资源分配与弹性调度 核心机制可视化 实验并行管理整体架构与关键组件
并行实验概述
刘师傅接了一桌大宴:二十道菜,只有两个灶台在用,其余四个空着。传菜员小伍不解:“师傅,一个菜一个菜炒不就行了?” 刘师傅摇头:“那客人得等到深夜。做实验也一样——你的 GPU 明明有八张,却一次只跑一个调参实验,其余七张睡觉,这就是串行浪费。” 并行实验的核心直觉很简单:把多个互相独立的实验同时丢进集群,让算力“满灶开火”。
但并行不是没有代价的。每个实验需要数据集加载、日志上报、checkpoint 落盘,这些“备菜”步骤无法完全并行;有些实验之间有依赖,必须等前一个出锅。于是,我们需要一个公式来评估“到底能快多少”。Amdahl 定律给出了理想上限:假设一个任务有占比 $p$ 的部分可以完美并行,剩余 $1-p$ 必须串行,当并行度为 $N$(即同时跑 N 个实验)时,加速比 $S$ 为:
1. 并行比例 $p$:$p$ 表示整个流程中可以被拆开同时做的部分。比如 6 个互不相关的超参数实验,$p=0.8$,说明 80% 的工作量可以并行。
2. 并行度 $N$:$N$ 是同时运行的实验数量,相当于后厨同时开火的灶台数。$N$ 越大,并行部分被均分得越细。
3. 串行部分 $1-p$:无论怎么分,串行部分(数据准备、启动开销)都纹丝不动地写在总耗时里。
4. 分母合成:分母 $=(1-p)+p/N$,它表示“考虑并行后的等效总工期”。
5. 加速比 $S$:用 1(原始串行耗时)除以等效总工期,得到“快了多少倍”。
回到刘师傅的后厨:他评估过,自家后厨约 90% 的工作可以并行($p=0.9$),所以就算再加一百口锅($N=100$),最多也快不过 10 倍。想通这一点,他不急着添灶台,而是先把“备菜区”的流程优化掉——这就是并行实验规划的第一课:先算天花板,再谈堆机器。
调度策略设计
现在后厨有六口锅、十个菜要做,先做哪个?刘师傅有三条规矩:先来后到别乱插队(FIFO)、大客户的硬菜优先上(优先级)、也不能让任一桌等太久饿着(公平)。这三种策略,正是实验调度器中三套经典算法,背后都是“在公平与效率之间做权衡”。
FIFO(First In First Out)最简单:谁先提交谁先占用 GPU。它的等待时间也很好预测——第 $i$ 个实验的等待时长,就是排在它前面的所有实验时长之和:
1. 任务时长 $d_j$:第 $j$ 个实验预计占用的 GPU 时长,相当于每桌客人的用餐时间,单位是小时或 GPU·小时。
2. 下标 $j$ 到 $i-1$:把排在实验 $i$ 前面的所有实验全部累加,一个不漏。
3. 累加符号 $\sum$:类似“把前面所有菜的上菜时长加起来”,这是最朴素的总和运算。
4. 等待时间 $W_i$:第 $i$ 个实验从提交到真正跑起来之间的空闲耗时。FIFO 下它完全由前人决定。
如果某个“探索性小实验”排在一个八小时大训练后面,它要等八小时才能验证想法。刘师傅的解法是“贵客插队”:给调试类小实验高优先级,必要时抢占低优先级任务的灶台(优先级抢占调度)。而公平调度(Fair Scheduling)则类似“轮流上菜”:每个团队按配额轮转,防止某个大客户独占后厨。实际平台常把三者组合:先按优先级分桶,桶内 FIFO,超时则提升等待者的优先级——这就是 K8s 调度器里常见的排队模型。
资源分配管理
灶台怎么分给不同菜系?刘师傅把六口锅分成:两口湘菜专用、一口炖汤专用、三口水、油、汽都通用的“万能灶”;晚高峰时,炖汤区空闲,就把炖锅借给蒸菜用。这套“分区 + 弹性借用”,正是 GPU 资源池的设计思路。
资源分配效率最核心的指标是资源利用率。通俗说,就是一台 GPU 真正在算模型的时间占比:
1. 忙碌时间 $T_{\text{busy}}$:GPU 执行矩阵运算、梯度回传的有效计算时间。
2. 空闲时间 $T_{\text{idle}}$:GPU 既没有任务跑、又没被预占的时间,对应后厨“灶台空烧”。
3. 总时间求和:分母把忙碌和空闲相加,得到统计周期内的总时间。
4. 利用率 $U$:比值越高,说明算力越“忙”。但 100% 利用率往往伴随大量排队等待(见“量化分析”一节)。
刘师傅的管理招式对应到集群上:资源池划分是把 GPU 按团队/项目分组,避免互相抢占内耗;弹性伸缩是在某个池空闲时把资源临时借给繁忙池,类似“万能灶”;超卖机制是允许平台承诺的 GPU 总数超出物理总数(因为多数实验吃不满显存),赌的是“客人不会全部同时点大菜”;配额管理(Quota)则给每个团队设置 CPU/GPU/内存上限,保证谁都不能独占后厨。这四招配合,让整体利用率从 40% 提到 80% 以上。
实验依赖管理
佛跳墙这道菜,得提前两天熬高汤;高汤没好,后续所有炖煮都无从谈起。在实验流水线里同样如此:数据预处理没跑完,模型微调就绝不能启动;微调没完成,评测脚本也只能排队。这就是实验依赖。
刘师傅在后厨贴了一张流程图,标明每道菜的前置工序;实验系统则用有向无环图(DAG)来建模这种关系。在这个图中,每个节点是一个实验/任务,每条边表示“必须先完成 A 才能开始 B”。整个流水线的总耗时,取决于图上最长的那条路——关键路径:
1. 任务时长 $d_{uv}$:边 $(u,v)$ 上的任务 $v$ 的预计执行时长,作为路径上的“重量”。
2. 路径 $P$:从入口节点到出口节点的一条完整依赖链路,比如“预处理→微调→评测”。
3. 累加 $\sum_{(u,v)\in P}$:把一条路径上所有任务的时长加起来,得到这条路的总耗时。
4. 最大算子 $\max$:在所有可行路径 $\mathcal{P}$ 中挑出最长的一条,就是关键路径 $T_{\text{crit}}$。
有了依赖图,系统可以做三件聪明事:上游完成触发(高汤熬好自动通知炖锅开工,无需人工盯着)、缓存复用(同一份预处理结果打上哈希标记,下游实验直接引用,不必重跑)、失败重试(某个实验挂了,只重试它的子图,不殃及其余并行分支)。刘师傅后厨的“高汤提前两天熬 + 蒸菜随时可动”,正是这套逻辑的土味版。
冲突解决机制
晚高峰,蒸鱼和梅菜扣肉同时要用唯一的一眼蒸锅。刘师傅的处理方式有三种:让蒸鱼改到炒锅上(资源抢占)、让扣肉排队等蒸锅空了再上(排队等待)、或者给蒸锅配一把钥匙谁拿到谁用(互斥锁)。实验集群里的资源冲突,解法如出一辙。
当多个实验同时申请同一块 GPU 或同一份缓存数据时,系统的调度器需要仲裁。冲突发生的概率并不低——它是各实验资源需求相互重叠的综合结果。若每个实验单独与目标资源冲突的概率为 $p_i$,多个实验同时申请时至少发生一次冲突的概率为:
1. 单任务冲突概率 $p_i$:第 $i$ 个实验与目标资源(某块 GPU)发生竞争的概率,来自历史统计。
2. 不冲突概率 $1-p_i$:每个实验“运气好没碰到资源被占”的可能性。
3. 连乘 $\prod$:假设各实验互不影响,把 n 个“不冲突”概率乘起来,得到“所有人都不冲突”的概率。
4. 取补 $P_c$:用 1 减去“无人冲突”,得到“至少有一人冲突”的概率 $P_c$。
冲突发生后,抢占式调度会挂起低优先级实验,把 GPU 让给高优先级任务(注意要做 checkpoint 以便恢复);非抢占式则让后来的实验排队。互斥锁(Mutex)常用于保护共享资源(如参数服务器、数据库记录),防止两个实验同时写入导致数据踩踏。当自动仲裁无法满足业务要求时,就需要人工介入——比如刘师傅亲自拍板:扣肉今天的客人是大领导,蒸鱼让位。好的平台会提供“人工仲裁”接口,让管理员手动调整优先级。
量化分析优化
刘师傅的账本上永远记着三个数:一小时能翻几桌(吞吐量)、每张桌平均等多久(排队时长)、每道菜的毛利(单位成本收益)。实验平台的运营者同样需要一套量化仪表盘,不然“并行优化”就是拍脑袋。
排队论给了我们一个黄金公式——Little 定律:在稳定系统中,队列平均长度等于到达率乘以平均等待时间:
1. 到达率 $\lambda$:单位时间内新提交到集群的实验数量,单位是“个/小时”。
2. 平均等待时间 $W$:一个实验从提交到开始运行的平均耗时,单位是“小时”。
3. 系统中实验数 $L$:正在运行和排队等待的实验总和,这是集群“积压量”的直接反映。
算力管理员可以据此反推:想要把队列长度控制在 3 个以内,当到达率为 2 个/小时时,平均等待时间必须压到 1.5 小时以内,否则就得扩容或者限流。实践中还要跟踪吞吐量(每小时完成的实验数)、资源利用率(上一节的 $U$)和成本核算(GPU 单价 × 占用时长,用 GPU·小时计费)。当利用率逼近 100%,Little 定律会警告你:等待时间正在指数级膨胀——这就像餐厅坐满但翻不了台,客人全堵在门口,营业额反而上不去。
MLOps工具链
刘师傅最终把后厨的所有规矩装进了一个平板系统:点单自动排入队列、灶台状态实时显示、高汤熬好自动提醒、冲突时弹窗请示。这套系统,就是 MLOps 平台对实验并行管理的落地形态。
平台把“提交实验—排队—分配 GPU—跑训练—记录指标—回收资源”的全流程自动化,典型的工具如 Kubeflow、Airflow + Argo Workflows、Weights & Biases 的 Sweep 功能。它们统一提供声明式 API(YAML 描述要跑什么、要几张卡、依赖哪些上游),平台负责调度和容错。衡量这套系统值不值得投入,可以用成本收益公式:
1. 收益增量 $\Delta R$:并行调度带来的算力节省,通常换算为“GPU·小时 × 单价”的金额。
2. 成本增量 $\Delta C$:搭建/维护调度平台的工程人力与服务器开销。
3. 分子 $\Delta R-\Delta C$:净收益,即“省下的钱减去花出去的钱”。
4. 百分比折算:再除以成本并乘 100%,得到每投入 1 元带来的回报倍数。
平台可观测性(日志、指标、trace 三件套)让每个 GPU 的利用情况、每个实验的排队原因都一目了然;API 设计遵循“提交即声明、查询即状态、取消即回收”的简洁原则。刘师傅的平板系统让后厨从“靠吼”变成“靠屏”,你的 AI 研发团队,也需要这样一块“屏幕”把调度智慧固化成工程能力。
AI 应用场景
超参数搜索并行化
阶段:模型训练与调优
解决的问题:传统调参靠肉眼盯 loss 曲线,一次只能跑一组超参数;面对 20 组候选参数,串行要 20 个训练周期,浪费算力且拖慢迭代。
具体案例:某推荐算法团队使用 Weights & Biases Sweep 并行启动 8 组超参数实验(学习率 × 批量大小 × 层数组合),调度器自动把它们塞进 4 张 GPU 的弹性资源池,跑完自动记录指标并排名。原来 3 天的调参压缩到 6 小时,且每块 GPU 利用率稳定在 85% 以上。
大模型消融实验流水线
阶段:模型架构探索与验证
解决的问题:消融实验(去掉某个模块看效果变化)之间有着天然依赖:必须先跑基线(baseline),再跑变体(variant)。人工盯“基线跑完再提交变体”又慢又易错。
具体案例:某 NLP 团队的 LLaMA 微调项目中,用 Argo Workflows 将“数据预处理→基线微调→三种消融变体→统一评测”建模为 DAG。平台自动在所有变体就绪后并行启动,并将预处理结果缓存复用。整个评测周期从 5 天缩至 2 天。
多团队共享 GPU 集群
阶段:算力资源运营
解决的问题:多个算法团队共用 GPU 集群时,容易发生“抢卡”纷争:某个团队提交 100 个任务占满集群,其他团队排队到怀疑人生。
具体案例:某互联网公司用 Kubernetes + Kueue 搭建共享集群,为 3 个团队划分资源配额(AI 团队 50%、推荐团队 30%、临时探索 20%),并设置优先级抢占。临时探索任务在晚间自动插队跑资源闲置期,利用率从 50% 提升到 78%,团队间投诉基本清零。
Python 演示
"""实验并行调度器:模拟 FCFS 调度 + 依赖检查 + 资源分配"""from dataclasses import dataclass, field @dataclassclass Experiment: name: str duration: int # 需要的计算时长(步数) dependencies: list = field(default_factory=list) # 依赖的实验名列表 status: str = "pending" # pending / running / done time_left: int = 0 def __post_init__(self): self.time_left = self.duration def can_start(self, done_names: set) -> bool: """只有当所有依赖实验都已完成时,本实验才能启动""" return all(dep in done_names for dep in self.dependencies) class ParallelScheduler: def __init__(self, gpu_count: int, experiments: list): self.gpu_count = gpu_count # GPU 资源数 self.experiments = experiments # 实验列表(顺序即优先级) self.free_count = gpu_count # 当前空闲 GPU 数 self.done_names = set() # 已完成实验集合 self.log = [] # 调度日志 def tick(self, t: int): """每个时间步:先启动可运行实验,再推进运行中实验的进度""" for exp in self.experiments: if exp.status == "pending" and exp.can_start(self.done_names) and self.free_count > 0: exp.status = "running" self.free_count -= 1 self.log.append(f"t={t:3d} | 启动 {exp.name:8s} | 空闲GPU {self.free_count}") for exp in self.experiments: if exp.status != "running": continue exp.time_left -= 1 if exp.time_left == 0: exp.status = "done" self.done_names.add(exp.name) self.free_count += 1 self.log.append(f"t={t:3d} | 完成 {exp.name:8s} | 空闲GPU {self.free_count}") def run(self, max_steps: int = 100): t = 0 while len(self.done_names) < len(self.experiments) and t < max_steps: t += 1 self.tick(t) self.log.append(f"总耗时 {t} 步,共运行 {len(self.experiments)} 个实验") return t def main(): # 实验清单:(名称, 时长, 依赖) exps = [ Experiment("preprocess", 2), Experiment("finetune", 4, ["preprocess"]), Experiment("eval", 2, ["finetune"]), Experiment("ablation_a", 3, ["preprocess"]), Experiment("ablation_b", 3, ["preprocess"]), ] scheduler = ParallelScheduler(gpu_count=2, experiments=exps) scheduler.run() print("== 并行调度结果 ==") print("\n".join(scheduler.log)) if __name__ == "__main__": main()
dataclass用简洁的类定义实验结构,包含名称、时长、依赖列表和状态。can_start(self, done_names)检查所有依赖是否已完成,这是依赖管理的核心判断逻辑。self.free_count = gpu_count维护当前空闲 GPU 数量,模拟显式资源池。for exp in self.experiments:按提交顺序(即 FIFO 优先级)遍历实验,先到先启动。exp.status == "pending" and exp.can_start(...)双重条件:既有空闲 GPU,又满足依赖。self.done_names.add(exp.name)实验完成后记录到已完成集合,供下游任务查询。while len(self.done_names) < len(self.experiments)终止条件:所有实验完成即结束模拟。f"t={t:3d} | 启动 {exp.name:8s}"格式化输出调度日志,展示每个时间步的决策。
常见误区
误区“我有 8 张卡,就把 8 个实验同时跑起来,这样肯定最快。资源闲着就是浪费。”
正解并行实验数量受两个约束:一是 Amdahl 定律里串行部分的天花板,二是集群资源竞争。当 8 个实验同时读同一份数据、抢同一块显存时,I/O 争抢会让每个实验都变慢。就像后厨把 8 个灶台全做需要同一个烤箱的菜,结果烤箱门口堵成一团。正确的做法是评估资源画像,控制并行度在“吞吐量拐点”附近。
为何常见:直觉上“越多并行越快”成立,但忽略了共享资源(磁盘、带宽、缓存)的争抢,很多人栽了跟头才理解。
误区“谁先提交谁先跑,这样最公平。搞优先级是给特权,会让系统混乱。”
正解FIFO 看似公平,实则被长任务“劫持”——一个 8 小时的预训练任务会让所有 5 分钟的调试实验等半天。调试者为了快,反而会频繁手动 kill 长任务,造成更严重的资源浪费。公平的正确含义是“感知等待时间的公平”:短任务应该通过优先级插队或抢占快速完成,长任务适当让路。
为何常见:人们常把“先来后到”等同于公平,但忽略了任务时长差异带来的系统性偏差。
误区“平台允许我给 10 个任务各申请 2 张卡,但物理上只有 16 张卡,超卖就是赚到了。”
正解超卖(Overcommitment)的前提是多数任务不会同时吃满资源,赌的是概率。一旦多个大任务同时申请,系统会触发排队甚至 OOM(内存溢出)。它本质是用“可接受的等待时间”换“更高的资源利用率”,必须配合配额和抢占策略兜底,否则就是超售灾难。
为何常见:超卖字面上像“占便宜”,让人忽略了它的风险本质是概率博弈。
误区“我有 Excel 表记录了每个实验的上下游,跑之前看一眼就行,不需要什么 DAG。”
正解当实验数超过 20 个、提交频率达到每天上百次时,人工依赖检查必然出错——漏看一个依赖,下游实验用脏数据跑完,等于白烧几万 GPU·小时。依赖必须建模进系统(DAG),由上游完成事件自动触发下游,才能保证“永远不被脏数据污染”。
为何常见:小规模时人工管理尚可,规模一上来,“记忆不可靠”的问题就集中爆发。
误区“KPI 就是 GPU 利用率,想办法干到 99%,说明算力一点没浪费。”
正解Little 定律 $L=\lambda W$ 揭示了一切——当利用率逼近 100%,到达率略增就会让排队时间($W$)指数爆炸,大量实验积压在队列里的时间也是成本。利用率 90% 且等待时间 10 分钟,可能优于利用率 99% 但等待 2 小时。好的运营目标是“利用率 × 吞吐量”的联合最优,而不是单指标最大化。
为何常见:利用率是看得见的“忙碌”,排队时间是看不见的“内耗”,人们天然只盯着显性指标。
面试题
Q1. 并行实验的核心收益是什么?
- A.降低单次实验的算法精度
- B.缩短整体模型研发周期← 正确答案
- C.减少训练所需的全部代码
- D.自动提升模型的最终效果
答案:B。并行实验通过同时运行多个候选方案来压缩“实验矩阵”的墙钟时间,本质是缩短研发周期。它不改变单次实验精度(排除 A、D),也不减少代码量(排除 C)。就像后厨多灶同开,菜还是那些菜,但上菜更快。
Q2. FIFO 调度策略的典型问题是什么?
- A.实现复杂度太高难落地
- B.长任务会阻塞短任务← 正确答案
- C.完全不支持多 GPU 场景
- D.无法记录实验参数
答案:B。FIFO 按提交顺序执行,一个 8 小时长任务会让后续短任务全部排队等待。这正是“前面坐了一桌三小时宴席”的窘境。它实现简单、支持多卡,也能记录参数,故排除其余选项。
Q3. 实验依赖关系通常用什么数据结构建模?
- A.链表(LinkedList)
- B.哈希表(HashMap)
- C.有向无环图(DAG)← 正确答案
- D.二叉树(BinaryTree)
答案:C。有向无环图能自然表达“先做 A 再做 B”的偏序关系,且无环保证不会出现死循环等待。链表只表达线性顺序,哈希表只管查找,二叉树处理层级关系,都不适合表达多对多的依赖约束。
Q4. 根据 Amdahl 定律,当并行比例 $p=0.8$、并行度 $N=4$ 时,理想加速比是多少?
- A.2.5← 正确答案
- B.3.0
- C.3.2
- D.4.0
答案:A。代入公式 $S=1/((1-0.8)+0.8/4)=1/(0.2+0.2)=2.5$。即便有 4 倍并行度,加速比也只有 2.5 倍,因为 20% 的串行部分拖了后腿。这正说明“堆卡不如优化串行瓶颈”。
Q5. 当集群资源利用率逼近 100% 时,最可能发生什么?
- A.实验训练速度自动翻倍
- B.排队等待时间急剧上升← 正确答案
- C.单个实验精度显著提升
- D.集群能耗自动降低
答案:B。Little 定律 $L=\lambda W$ 显示,利用率接近饱和时系统积压任务,平均等待时间 $W$ 对到达率十分敏感,微小的提交波动就会让排队爆炸。利用率高不等于完成量大,可能只是“堵车严重”。
Q6. 哪些策略可以有效缓解“长任务阻塞短任务”?
- A.给短任务赋予更高优先级← 正确答案
- B.采用公平轮转调度算法← 正确答案
- C.严格维持 FIFO 提交顺序
- D.允许低优先级任务被抢占← 正确答案
答案:ABD。优先级调度让短任务“插队”(A),公平轮转按时间片分权防止饿死(B),抢占机制可以把 GPU 从长任务手中夺给紧急短任务(D)。C 选项正是问题本身,不能作为解法。
Q7. Little 定律 $L=\lambda W$ 中,$\lambda$ 的含义是什么?
- A.队列平均长度
- B.实验到达系统的速率← 正确答案
- C.单个实验运行时长
- D.集群可用 GPU 总数
答案:B。$\lambda$ 是单位时间新提交实验数(到达率),$W$ 是平均等待时间,两者相乘得到在途数量 $L$。它不直接等于队列长度(排除 A),也不是实验时长或 GPU 数量(排除 C、D)。
Q8. 某集群实验到达率 $\lambda=2$ 个/小时,平均等待 $W=1.5$ 小时,集群中平均有多少个实验在排队或运行?
- A.1 个
- B.2 个
- C.3 个← 正确答案
- D.4 个
答案:C。由 Little 定律 $L=\lambda W=2\times1.5=3$ 个。它表示稳定状态下系统中的平均实验数。这个数超过集群容量时,意味着队列会无限增长,需要扩容或限流。
Q9. 关于并行实验管理,下列说法正确的是?
- A.依赖图可帮助并行执行互不相关的实验← 正确答案
- B.缓存复用能避免下游实验重复计算← 正确答案
- C.资源超卖一定能提升任务吞吐
- D.抢占调度可能打断低优先级任务← 正确答案
答案:ABD。DAG 明确依赖后,系统可识别无依赖关系的分支并行执行(A);缓存复用把上游计算结果打哈希存储,下游直接引用(B);抢占调度剥夺低优先级任务的 GPU(D)。超卖只是换取高利用率的概率手段,不一定提升吞吐(C 错)。
Q10. 对 Little 定律 $L=\lambda W$ 与资源利用率的理解,正确的有?
- A.利用率逼近 100% 时,到达率微小增加会导致等待暴涨← 正确答案
- B.等待时间 $W$ 与到达率 $\lambda$ 在稳定系统中满足反比关系
- C.降低到达率可缩短队列长度但会降低吞吐← 正确答案
- D.利用率 90% 且等待短,可能优于利用率 99% 但等待长← 正确答案
答案:ACD。饱和系统中 $W$ 对 $\lambda$ 高度敏感(A 对)。稳定系统中 $L$ 不变时 $W$ 与 $\lambda$ 成反比,而非任何情况下都反比(B 错)。限流降低到达率确实缩短队列,但单位时间完成实验数也下降(C 对)。运营应看“利用率 × 吞吐 × 等待”的联合指标(D 对)。