想象你是一家网红奶茶店的老板。平时每天 500 位顾客,两个店员从容应付。突然有一天,一位美食博主在短视频里推荐了你的招牌水果茶,第二天下午三点,店里瞬间涌入 5000 人——队伍排到隔壁街道,原料桶见底,店员手忙脚乱,出杯速度越来越慢,最后收银机当场死机,顾客们愤怒地打了差评。 这样的“流量洪峰”,每天都在 LLM 服务的世界里真实上演:电商大促、热点事件、新品发布,都可能让请求量在几分钟内暴涨数十倍。如果服务没有一套应对策略,就会像那家奶茶店一样——响应变慢、请求超时、用户流失。 幸运的是,有经验的奶茶店老板早有准备:提前看天气预报和商场活动安排来预测客流,备足原料和人力,客流暴涨时加雇临时工,进店超员时门口排队取号,原料不足时简化菜单,厨房故障时暂停接单,还有一块实时显示排队人数和出杯速度的监控屏——这些朴素的经验,正是 LLM 服务应对突发流量的完整方法论:流量预测、容量规划、弹性伸缩、限流保护、排队降级、熔断恢复与监控告警。

岗位关联

学完本文,你将掌握 LLM 服务在流量洪峰下“活下来”的完整套路:从预测、规划到弹性伸缩、限流降级与熔断恢复。这是云架构师、DevOps 工程师和技术管理者的核心看家本领。

目录
  1. 可视化演示
  2. 流量预测分析
  3. 容量规划评估
  4. 弹性伸缩策略
  5. 服务限流保护
  6. 排队降级机制
  7. 熔断恢复机制
  8. 监控告警体系
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

流量预测分析

奶茶店老板的柜台上放着一本厚厚的经营日志,上面记录着每天的天气、是否促销、卖了多少杯。每个周末打烊后,他都会翻看这本日志,琢磨“下周六会来多少客人”。这就是预测——不是算命,而是从历史中找规律。

对 LLM 服务来说,流量预测同样不是玄学,而是四个动作的组合。第一是历史数据回溯:翻出过去一年的请求日志,按小时统计 QPS,找出“去年同期发生了什么”。第二是业务事件驱动:把公司的大促日历、产品发布会、营销活动排期转换成流量增量因子——就像奶茶店老板知道商场贴出“买一送一”海报那天,客流一定会涨。第三是周期规律挖掘:识别日、周、月的重复模式,比如工作日上午十点和晚上八点总是出现两个请求高峰,每周一模型调用量明显高于周日。第四是预测模型评估:通过 MAPE(平均绝对百分比误差)等指标衡量预测偏差,持续修正预测参数。

奶茶店老板在预测时会格外看重“昨天卖了 500 杯”这个数字,而不是上个月的日均——加权移动平均正是把这种直觉数学化:让近期的流量数据拥有最大的发言权。预测越准,后面的容量规划越有底气。

y^t+1=∑i=0n−1wiyt−i\displaystyle \hat{y}_{t+1} = \sum_{i=0}^{n-1} w_i y_{t-i}
加权移动平均的核心思想:用“最近 n 个时刻的真实流量”加权求和来推断下一时刻,且离现在越近的数据权重越高。
  1. 预测值$\hat{y}_{t+1}$ 带上“帽子”符号,表示这是对下一时刻流量的估计值,而非真实观测值
    y^t+1\hat{y}_{t+1}
  2. 历史观测$y_{t-i}$ 是回溯 i 个时间步的真实流量记录,i=0 时就是“刚刚”的流量
    yt−iy_{t-i}
  3. 权重系数$w_i$ 表示第 i 个历史值在预测中的分量,时间离得越近,权重越大
    wiw_i
  4. 求和归一$\sum_{i=0}^{n-1}$ 把所有历史项加权求和,且所有权重之和为 1,确保预测值落在合理刻度
    ∑i=0n−1wi=1\sum_{i=0}^{n-1} w_i = 1

容量规划评估

预测到周末会大爆满之后,店长开始算账:店里最多能同时站多少人?几台奶茶机一刻不停能出多少杯?要提前备多少珍珠和鲜奶?这套“算账”在技术世界叫容量规划。

容量规划包含四个步骤。峰值需求估算:根据预测结果换算出峰值 QPS 和峰值并发数,这是规划的目标值。资源基线测量:通过压测得到单个 LLM 实例的 QPS 上限、显存占用和 P99 延迟——相当于让店员试做 100 杯,测出单人单机的极限速度。余量设计原则:容量目标 = 峰值 ×(1 + 冗余系数),冗余系数通常取 20%~50%,用来吸收预测误差和未知波动。压测验证方法:用压测工具(如 k6、Locust)模拟真实流量冲击服务,验证容量评估是否准确,就像大促前一晚让临时工提前演练一遍。

这就像奶茶店的操作台:每分钟进来 10 个订单(QPS=10),每单从下单到出杯平均要 2 分钟(T=2),那操作台上任何时刻都会堆着 20 杯在做的饮品(C=20)。如果操作台只能放 15 杯,说明系统的并发能力不够了。

C=QPS×T\displaystyle C = QPS \times T
利特尔法则揭示了一个朴素规律:并发数 = 每秒来的请求数 × 每个请求在系统里待的时间。
  1. 并发数$C$ 表示任一时刻系统内正在处理中的请求总数,也就是“同时占着坑的请求”
    CC
  2. 请求速率$QPS$ 是每秒进入系统的请求数,即系统的吞吐压力
    QPSQPS
  3. 平均耗时$T$ 是每个请求从进入到完成所需的平均时间(秒)
    TT
  4. 乘积关系$\times$ 将“来的速度”与“处理时长”结合——来得多走得慢,系统里堆积的就多
    C=QPS×TC = QPS \times T

弹性伸缩策略

客流高峰杀到,店长一个电话召来三名兼职大学生,又支起一张折叠操作台;傍晚客流回落,就让兼职先下班、收起折叠台。这种“人多加人、人少减人”的动态调整,就是弹性伸缩。

在 Kubernetes 世界里,弹性伸缩有四个关键设计。水平自动扩缩:通过 HPA(Horizontal Pod Autoscaler)根据 CPU、内存或自定义指标自动增减 Pod 副本数——相当于按客流人数增减操作台。垂直资源调整:临时调大单个实例的 CPU 和显存配额,比如把 8GB 显存升到 16GB——相当于给奶茶机换一个更大的原料桶。伸缩阈值设定:合理设置触发条件,比如“CPU 使用率超过 70% 且持续 3 分钟则扩容一个副本”,防止瞬时抖动导致频繁伸缩。冷启动优化:大模型权重加载动辄数分钟,可通过预置实例池、容器镜像预热、模型权重预先加载等手段,让新实例“秒上岗”。

回到奶茶店:预测周末峰值 600 单/小时(QPS_peak),一名店员每小时最多做 60 单(QPS_single),再留 20% 的富余(m=0.2),那就需要 ⌈600/60 × 1.2⌉ = 12 名店员。伸缩不是拍脑袋,而是这套算术。

N=⌈QPSpeakQPSsingle×(1+m)⌉\displaystyle N = \left\lceil \frac{QPS_{peak}}{QPS_{single}} \times (1 + m) \right\rceil
实例数计算的本质:先看单兵作战能力,再看敌我兵力对比,最后加上保险系数。
  1. 峰值流量$QPS_{peak}$ 是预测出的最高每秒请求数,容量规划的目标值
    QPSpeakQPS_{peak}
  2. 单实例能力$QPS_{single}$ 是压测得出的单个实例最大吞吐,即“一个人最多能干的活”
    QPSsingleQPS_{single}
  3. 冗余系数$(1 + m)$ 在需求之上留出安全余量,$m$ 通常取 0.2~0.5
    1+m1 + m
  4. 向上取整$\lceil \cdot \rceil$ 是天花板函数,实例数必须是整数,且“宁多勿少”
    ⌈QPSpeakQPSsingle×(1+m)⌉\left\lceil \frac{QPS_{peak}}{QPS_{single}} \times (1 + m) \right\rceil

服务限流保护

店门口站着一位壮硕的保安,手里捏着计数器,店里满 50 人后,“请排队取号”——这就是限流。限流看似在“赶客”,实则在保护:让店内系统始终在安全容量内运转。

LLM 服务的限流体系包含四层设计。限流算法选择:固定窗口计数、滑动窗口、令牌桶、漏桶是四种经典算法,其中令牌桶能同时兼顾“平均速率限制”和“突发流量容忍”,是网关限流的主流选择。客户端限流:在 App 或 SDK 层面控制单个用户的请求频率,防止客户端异常重试或恶意刷接口——相当于保安认识老顾客,常客可以先放进去。网关层限流:在 API 网关统一施行全局限流,无论请求来自哪个客户端,都必须在“大门”处过闸机。过载保护:当系统负载超过危险线(如 CPU 90%),主动拒绝新请求、优先保护存量请求完成,这是最后的“保命手段”。

限流的精髓在于“先放行一部分,保全整体”。就像奶茶店保安宁可让顾客在门外排 10 分钟,也不让 100 人同时涌进只有 20 个座位的小店——那会让所有人都等 40 分钟并且体验崩溃。

Rlimit=NallowedTwindow\displaystyle R_{limit} = \frac{N_{allowed}}{T_{window}}
滑动窗口限流:在一个持续前移的时间窗口内规定放行额度,超过就拦下。
  1. 窗口时长$T_{window}$ 是滑动时间窗口的长度,如 1 秒或 1 分钟
    TwindowT_{window}
  2. 放行额度$N_{allowed}$ 是窗口内允许的最大请求数,相当于保安手里的“门票总数”
    NallowedN_{allowed}
  3. 限流速率$R_{limit}$ 是等效的每秒放行速率,超过即拒绝
    RlimitR_{limit}
  4. 窗口滑动窗口随当前时间不断前移,避免固定窗口的“临界突刺”问题
    NallowedTwindow\frac{N_{allowed}}{T_{window}}

排队降级机制

暴雨天客流实在太大,保安开始发号:你是 108 号,前面还有 30 桌,预计等 15 分钟。同时,招牌“雪山芝士莓莓”的草莓用完了,店员诚恳建议:“要不要试试基础款珍珠奶茶?一样好喝。”这就是排队和降级。

排队降级机制有四个设计要点。队列缓冲设计:将超出处理能力的请求写入消息队列(如 Kafka、Redis Stream),让后端按自身节奏消费,实现“削峰填谷”——就像取号机把等待客人的“需求”先存起来。优先级调度:在队列中为不同等级的请求分配权重,如付费用户、VIP 客户的请求优先出队。降级预案:提前准备好“降级菜单”:返回缓存结果、切换轻量模型、限制上下文长度(如 4K 降到 2K)、关闭非核心功能(如停止“联网搜索”)。友好提示反馈:对实在无法进入队列的请求,返回 429 状态码并携带 Retry-After 头部,告诉客户端“太忙了,请 30 秒后再来”。

这个公式最震撼的结论是:当 λ 逼近 μ 时,等待时间会急剧变长——奶茶店每秒来 58 个单、每秒只能做 60 个时,等待时间会明显拉长;若每秒只能做 59 个,同样的到达率下排队就会失控。所以系统设计一定要让 μ 远大于 λ,留出能力余量。

Wq=λμ(μ−λ)\displaystyle W_q = \frac{\lambda}{\mu(\mu - \lambda)}
M/M/1 排队模型:平均等待时间 = 到达率与(服务率 × 剩余能力)的比值。
  1. 到达率$\lambda$ 是单位时间内到达队列的请求数,代表“涌入速度”
    λ\lambda
  2. 服务率$\mu$ 是单位时间内服务完成的请求数,代表“处理速度”
    μ\mu
  3. 稳定性条件$\mu - \lambda$ 要求 $\mu > \lambda$,否则服务能力小于涌入速度,队列会无限拉长
    μ−λ>0\mu - \lambda > 0
  4. 等待时间$W_q$ 是请求在队列中的平均等待秒数,分母越小等待越久
    λμ(μ−λ)\frac{\lambda}{\mu(\mu - \lambda)}

熔断恢复机制

如果厨房的炸锅突然起火,店长会做三件事:先按下消防按钮停止一切接单(熔断打开);火灭了,打开一个小窗,只接几个熟客的订单试试(半开探测);确认出杯正常后,才重新开门迎客(恢复闭合)。这就是熔断器的完整生命周期。

熔断机制的设计包含四个环节。熔断状态机:记住三种状态——闭合(closed,正常放行)、打开(open,拒绝所有请求)、半开(half-open,试探性放行)。失败率阈值:在滚动窗口内统计失败率(超时、5xx 错误),当失败率 ≥ 阈值(如 50%),熔断器从闭合跳转为打开。半开探测恢复:打开状态持续一段时间(如 30 秒)后转入半开,放行少量探测请求,若成功率达到阈值则迅速恢复闭合,否则再次跳回打开。故障隔离:熔断只隔离故障依赖,避免一个下游服务的故障像多米诺骨牌一样压垮整个链路。

熔断的本质是“主动止损”:与其让所有请求都超时、把系统拖入雪崩,不如让一小部分请求快速失败,换回整体的快速恢复。这就像厨房起火时果断停业,远比勉强出杯制造更大的事故划算。

F=NfailedNtotal\displaystyle F = \frac{N_{failed}}{N_{total}}
失败率的计算很简单:最近 N 个请求里有多少个失败了。超过阈值,熔断器跳闸。
  1. 失败请求$N_{failed}$ 是最近滑动窗口内超时或返回错误的请求数量
    NfailedN_{failed}
  2. 总请求$N_{total}$ 是同时期进入系统的全部请求数量
    NtotalN_{total}
  3. 失败率$F$ 是两者的比值,代表系统的健康水平
    F=NfailedNtotalF = \frac{N_{failed}}{N_{total}}
  4. 阈值判断当 $F \geq 0.5$ 时,熔断器从闭合跳转为打开,拒绝新请求
    F≥0.5F \geq 0.5

监控告警体系

店长的办公室有一面监控墙:当前排队人数、三台奶茶机的运行状态、珍珠和鲜奶的库存、最近十分钟的出杯速度,全部实时刷新。任何一项指标异常,对讲机立刻响起——这就是监控告警。

一套完整的监控告警体系包含四层能力。核心指标监控:盯住四个黄金信号——QPS、延迟(P95/P99)、错误率和资源饱和度(GPU 利用率、显存占用、CPU)。日志追踪链路:为每个请求生成全链路 Trace ID,串联网关、模型服务、下游依赖的日志,一旦出问题能快速定位“请求究竟卡在了哪个环节”。告警分级响应:P0 级(如错误率 > 20%)通过短信 + 电话轰炸值班人,P1 级(如 P99 延迟超阈值)发企业微信并创建工单,P2 级仅记录观察。大屏可视化:把黄金指标集中到 Dashboard 大屏,帮助值班团队在一分钟内定位全局状态。

记住一个经典数字:99.9% 的 SLO 意味着每月最多约 43 分钟的故障时间。奶茶店要承诺“99.9% 的订单 3 分钟内出杯”,那一个月累计超时不得超过 43 分钟——超出预算就必须启动熔断和限流来“止损”。

A=Ntotal−NerrorNtotal×100%\displaystyle A = \frac{N_{total} - N_{error}}{N_{total}} \times 100\%
可用性 = 成功请求占比 × 100%,而 1 减可用性就是“允许失败的预算”。
  1. 成功量$N_{total} - N_{error}$ 是用总量减去失败量,得到成功处理的请求数
    Ntotal−NerrorN_{total} - N_{error}
  2. 可用性比值$\frac{N_{total} - N_{error}}{N_{total}}$ 计算成功请求占总量的比例
    Ntotal−NerrorNtotal\frac{N_{total} - N_{error}}{N_{total}}
  3. 百分比$\times 100\%$ 将比值转换为直观的百分比
    A=Ntotal−NerrorNtotal×100%A = \frac{N_{total} - N_{error}}{N_{total}} \times 100\%
  4. 误差预算$1 - A$ 即“可失败的额度”,如 SLO 99.9% 则每月约 43 分钟故障余量
    1−A1 - A

AI 应用场景

电商大促的智能客服 LLM 服务

阶段:流量预测与容量规划

解决的问题:双十一 0 点一到,智能客服的请求量在几分钟内暴涨 10 倍。传统做法是人工盯监控、手动加机器,往往要 30 分钟才能完成扩容,期间大量请求超时。通过预测 + 容量规划,系统在流量到来前就做好了准备。

具体案例:某电商平台在双十一前一个月,拉取历史大促日志并结合活动排期,预测出 0 点峰值 QPS 为平时的 12 倍。按 30% 冗余规划出 200 个 Pod 的目标容量,并配置 K8s HPA 自动扩缩。活动当晚系统自动扩容、平稳扛过洪峰,智能客服的 P99 延迟控制在 2 秒以内。

热点事件引发的 LLM 应用流量暴涨

阶段:弹性伸缩与限流降级

解决的问题:一款 AI 写作助手因用户晒出爆款文案在社交平台病毒式传播,2 小时内流量暴涨 50 倍。如果没有限流和降级预案,模型服务会被瞬间压垮。

具体案例:某创业公司紧急启用了“走红预案”:网关层令牌桶限流将入口 QPS 控制在安全范围;预置实例池在 30 秒内完成扩容;超长文生成降级为短文生成,非核心的“风格润色”功能直接关闭。系统在流量洪峰中保持了 99.9% 的可用性,事件结束后又平滑缩容。

在线教育开学季的 AI 批改服务保障

阶段:监控告警与熔断恢复

解决的问题:开学季数百万学生同时使用 AI 批改作业,上游大模型 API 因过载开始抖动,错误率急剧攀升,若不及时熔断,会拖垮整个批改链路。

具体案例:某教育平台的监控系统在错误率超过 50% 的瞬间触发熔断,AI 批改自动降级为“基础批改模式”(规则引擎批改),同时对上游 API 进行限流。上游服务恢复后,熔断器半开探测逐步放量,30 分钟内全量恢复,家长的投诉量被控制在了最低水平。

Python 演示

python75 行
import randomimport math  def generate_traffic(t):    """模拟 t 时刻的请求量: 平时 50 左右, 第 20-35 步飙到 400"""    if 20 <= t <= 35:        return 400 + random.randint(-20, 20)    return 50 + random.randint(-5, 5)  def predict_next_traffic(history):    """加权移动平均: 越近的数据权重越大"""    n = min(len(history), 5)    if n == 0:        return 50    weights = [0.1, 0.15, 0.2, 0.25, 0.3]    recent = history[-n:]    w_sum = sum(weights[-n:])    return sum(w * q for w, q in zip(weights[-n:], recent)) / w_sum  class TokenBucket:    """令牌桶限流器"""     def __init__(self, rate, capacity):        self.rate = rate          # 每秒补充令牌数        self.capacity = capacity  # 桶容量        self.tokens = capacity    # 当前令牌数     def allow(self, n=1):        self.tokens = min(self.capacity, self.tokens + self.rate)        if self.tokens >= n:            self.tokens -= n            return True        return False  def main():    SINGLE_INSTANCE_QPS = 60   # 单个实例能处理的 QPS    REDUNDANCY = 0.2           # 冗余系数    history = []    bucket = TokenBucket(rate=80, capacity=120)    stats = {"total": 0, "rejected": 0, "instances": []}     for t in range(50):        qps = generate_traffic(t)        history.append(qps)        pred = predict_next_traffic(history)        need = math.ceil(pred / SINGLE_INSTANCE_QPS * (1 + REDUNDANCY))        capacity = need * SINGLE_INSTANCE_QPS        allowed = 0        for _ in range(qps):            if allowed >= capacity * 1.2:                stats["rejected"] += 1                continue            if bucket.allow():                allowed += 1            else:                stats["rejected"] += 1        stats["total"] += qps        stats["instances"].append(need)        if t % 10 == 0 or 20 <= t <= 36:            drop = 1 - allowed / qps            print("t={:2d} QPS={:3d} 预测={:6.1f} 实例={:2d} 拒绝={:3d} 丢弃率={:.1%}".format(                t, qps, pred, need, qps - allowed, drop))     print("\n总请求={} 被拒={} 总丢弃率={:.2%}".format(        stats["total"], stats["rejected"], stats["rejected"] / stats["total"]))    print("实例数峰值={} 平均={:.1f}".format(        max(stats["instances"]), sum(stats["instances"]) / len(stats["instances"])))  if __name__ == "__main__":    main()
目的:模拟一次突发流量事件,演示“加权移动平均预测 → 按预测算实例数 → 令牌桶限流 → 计算丢弃率”的完整闭环。
  1. history.append(qps)每步把真实流量记入历史序列,为预测提供素材
  2. pred = predict_next_traffic(history)用加权移动平均推断下一时刻流量,权重偏向最近数据
  3. need = math.ceil(...)根据预测值、单实例能力与冗余系数算出目标实例数
  4. bucket.allow()令牌桶判断当前请求是否放行,是网关限流的经典实现
  5. if allowed >= capacity * 1.2:超过容量 120% 的请求直接拒绝,模拟过载保护
  6. stats["rejected"] += 1统计被限流丢弃的请求数,用于计算总丢弃率

常见误区

误区突发流量来了就加机器呗,云上资源无限,加到足够多肯定没问题。扩容是万能药。

正解扩容有三大隐形壁垒:一是冷启动延迟,大模型权重加载动辄数分钟,流量洪峰等不起;二是下游依赖瓶颈,比如向量数据库、认证服务可能先被压垮;三是云厂商配额和成本限制,临时加几百台 GPU 机器既不现实也可能被配额卡住。所以必须配合限流、降级、缓存等手段打“组合拳”,而不是把宝全押在扩容上。

为何常见:大家习惯了云计算“按需付费”的营销话术,忽略了物理资源上线的时延和依赖链的约束。

误区一旦限流,用户请求就被拒,体验极差。宁可让系统慢一点,也千万别拒绝用户。

正解限流拒绝的只是“超额的”请求。系统性崩溃时所有请求都超时,那才是真正的灾难。限流 + 排队 + 友好提示(“当前繁忙,请稍后再试”)保住了核心用户的体验,是“两害相权取其轻”。想想奶茶店,让顾客在门外排队,总比顾客冲进去把店挤爆、所有人喝不上奶茶要好得多。

为何常见:产品经理视角往往把“拒绝”视为体验失败,而工程视角更关注对存量请求的保护。

误区用深度学习模型预测流量才高级,简单移动平均太 low 了,精度肯定不够。

正解容量规划的实践中,预测精度并不是唯一目标。复杂模型需要大量数据训练,可业务事件(双十一、热点新闻)带来的流量突变是历史数据里没有的“黑天鹅”。业界常用做法是“简单基线预测 + 业务事件因子叠加 + 人工经验校正”,既稳健又可解释。

为何常见:过度迷信 AI 能力,忽略了业务场景的因果性——预测不是猜数字,而是理解流量为什么涨。

误区熔断打开说明服务不对劲,我应该马上发大量请求测试它恢复没有,这样能加速恢复。

正解熔断器打开后大量重试反而会加重下游负担,形成“惊群效应”。正确做法是半开状态只放行少量探测流量,成功率高才逐步放量恢复。这就像家里跳闸后,你不会把所有电器一次性全开,而是先插一盏台灯试试线路是否正常。

为何常见:人的第一反应是“赶紧看看好了没”,忽略了“过度抢救”对故障系统的二次伤害。

面试题

Q1. 遭遇突发流量时,以下哪一步是应对的第一要务?

单选题 · easy

  • A.立即限流保护
  • B.预测评估流量← 正确答案
  • C.直接加购机器
  • D.关闭次要服务

答案:B。突发流量应对的正确顺序是“先预测、再规划、后执行”(B)。立即限流(A)和加机器(C)都是在没搞清流量规模时盲目行动,可能过度限流伤及正常用户或扩容不足。关闭服务(D)更不可取。就像奶茶店老板得先判断“明天会来多少人”,才能决定备多少料、喊几个人。

Q2. 令牌桶容量为 100,每秒补充 10 个令牌,瞬间最多放行多少个请求?

单选题 · easy

  • A.十个请求
  • B.一百个← 正确答案
  • C.一百一十
  • D.无限多个

答案:B。令牌桶中,桶容量决定了瞬时突发能力。桶里有 100 个令牌时,一瞬间最多放行 100 个请求(B),之后只能按每秒 10 个的补充速率继续放行。一百一十(C)错在把桶容量和补充速率相加;无限多个(D)违背了限流的根本目的。

Q3. 以下属于 LLM 服务核心监控指标的是?

单选题 · easy

  • A.办公室温度
  • B.GPU 利用率← 正确答案
  • C.员工出勤率
  • D.会议室空置

答案:B。GPU 利用率是 LLM 推理服务的关键资源饱和度指标,直接反映算力是否吃紧(B)。办公室温度、员工出勤率、会议室空置都是与系统运行无关的指标,无法帮助判断服务是否将要过载。

Q4. 某 LLM 服务单实例 QPS 上限为 50,预测峰值流量 500,预留 20% 冗余,需要几个实例?

单选题 · mid

  • A.需要十个实例
  • B.需要十一个
  • C.需要十二个← 正确答案
  • D.需要十五个

答案:C。按弹性伸缩公式 N = ⌈峰值/单实例能力 × (1 + 冗余)⌉ = ⌈500/50 × 1.2⌉ = ⌈12⌉ = 12(C)。十个(A)没有留冗余,十一个(B)是向下取整,十五个(D)冗余系数算错为 0.5。就像奶茶店算人手,必须向上取整且留出缓冲。

Q5. M/M/1 排队模型中,λ=50 req/s,μ=60 req/s,请求的平均等待时间是多少秒?

单选题 · mid

  • A.零点零五秒
  • B.零点零八秒← 正确答案
  • C.零点一零秒
  • D.零点二零秒

答案:B。代入公式 W_q = λ / [μ(μ−λ)] = 50 / [60 × (60−50)] = 50 / 600 ≈ 0.083 秒,约等于 0.08 秒(B)。零点零五(A)错把分母当成 μ−λ,零点一零(C)和零点二零(D)属于计算错误。排队论提醒我们:服务率 μ 必须明显大于到达率 λ,否则等待时间会急剧恶化。

Q6. 限流与降级的关键区别是什么?

单选题 · mid

  • A.限流放行所有请求而降级拒绝
  • B.限流拒绝超额请求降级降低规格← 正确答案
  • C.两者完全没有本质上的区别
  • D.限流针对用户而降级针对服务器

答案:B。限流是对“超额请求”直接拒绝,保护系统不过载;降级是降低服务规格(如返回缓存结果、切换轻量模型)来换取整体可用性(B)。A 把两者的作用对象搞反了;C 完全错误;D 的划分不准确,两者都服务于系统保护。

Q7. 弹性伸缩中防止“抖动”(频繁伸缩震荡)的常用手段是?

单选题 · mid

  • A.一定调低触发阈值
  • B.设置冷却等待窗口← 正确答案
  • C.取消所有缩容动作
  • D.缩短指标观察周期

答案:B。设置冷却时间/观察窗口(B),让伸缩动作执行后等待一段时间再评估下一次伸缩,是防止系统在阈值边界来回震荡的经典手段。调低阈值(A)和缩短观察周期(D)反而加剧抖动;取消缩容(C)会造成资源浪费。

Q8. 以下属于 LLM 服务降级预案的是?

多选题 · hard

  • A.返回缓存结果即可← 正确答案
  • B.切换为轻量级模型← 正确答案
  • C.拒绝所有用户请求
  • D.缩短上下文的长度← 正确答案

答案:ABD。降级的核心是“牺牲一点质量,保住整体可用”。返回缓存结果(A)、切换到轻量模型(B)、缩短上下文长度(D)都是典型的降级手段。拒绝所有用户请求(C)属于完全中断服务,不是降级而是“躺平”。就像奶茶店用基础款替代招牌款,但不会直接关门。

Q9. 关于熔断器半开状态,下列说法正确的是?

多选题 · hard

  • A.放行全部请求验证恢复
  • B.放行少量试探请求检测← 正确答案
  • C.成功率达标则关闭熔断← 正确答案
  • D.失败则重新打开熔断← 正确答案

答案:BCD。半开状态的核心是“小流量试探”:只放行少量请求探测下游是否恢复(B),成功率达到阈值就恢复闭合(C),若探测请求失败则立即回到打开状态(D)。A 错在放行全部请求,那会让刚缓过来的下游再次被压垮,失去半开的意义。

Q10. 某 LLM 服务预测峰值 2000 QPS,单实例支撑 300 QPS,但下游向量库上限仅 1000 QPS,合理的应对措施有哪些?

多选题 · extreme

  • A.扩容到七个实例即可
  • B.扩容同时保护向量库← 正确答案
  • C.优化向量库容量上限← 正确答案
  • D.忽略瓶颈只扩容应用

答案:BC。只看应用层需要 ⌈2000/300⌉ ≈ 7 个实例(A 单独看没错),但下游向量库只能扛 1000 QPS,必须同时解决依赖瓶颈:扩容应用的同时对向量库限流保护(B),并优化向量库容量(C)。只扩容应用而忽略依赖(D)必然导致雪崩。这就像奶茶店加了一堆店员,但制冰机只能产那么多冰,照样出不了杯。