假设你开了一家餐厅。开业前,你想知道后厨到底能扛住多大的客流——周六晚高峰来 300 桌客人,是游刃有余还是鸡飞狗跳?于是你策划了一场“满座彩排”:不真接待顾客,而是按真实菜单、真实点餐节奏,把餐厅从空座慢慢塞到爆满,观察厨师出菜速度、传菜通道宽度、等位区的忍耐极限。这套彩排,放在 AI 服务身上,就叫吞吐量压测。这篇文章要讲的,就是怎么设计这场“彩排”:构造什么样的客流(场景模型)、怎么一点点加人(并发梯度)、怎么读出菜速率(吞吐指标)、出菜慢了卡在哪个环节(瓶颈定位)、是否该扩建厨房(容量规划)、平时怎么盯仪表(监控配置),以及如何让彩排变成每周自动进行的制度(自动化流水线)。

岗位关联

对 AI 从业者而言,吞吐量压测是容量规划的“地基”——没有它,你无法回答“这个模型服务到底够不够用”,更不敢在流量高峰前拍板扩容。

目录
  1. 可视化演示
  2. 场景模型设计
  3. 并发梯度策略
  4. 吞吐量指标
  5. 瓶颈定位
  6. 容量规划
  7. 监控配置
  8. 自动化流水线
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示吞吐量压测:并发梯度策略、吞吐量随并发上升与饱和曲线、瓶颈定位与容量规划关联,通过交互理解AI推理服务峰值压测。

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

并发压测:梯度上升 并发梯度策略 瓶颈定位 Ld 压测支撑容量规划

场景模型设计

餐厅要做“满座彩排”,不能只准备一道菜。真实晚高峰的菜单里有凉菜、热菜、汤羹、甜品,还有外卖订单穿插其中。如果彩排只让厨师反复炒同一道菜,一旦真正开业时客人点的菜五花八门,后厨节奏立刻乱套。AI 服务的流量同样五花八门——有短文本分类、有长文档摘要、有图片问答,所以压测的第一步不是盲目地发请求,而是先设计一份“流量菜单”,也就是场景模型。

场景模型要回答四个问题。首先是请求模式建模:各类请求占多大比例、输入输出 Token 长度分布如何,这决定了模型前向计算的负载特征。其次是测试数据构造:数据要贴近生产分布,否则缓存命中率会虚高,测出来的吞吐量到了线上就缩水。再次是链路范围界定:是只压推理服务本身,还是走完网关、鉴权、模型、存储的端到端链路。最后是场景参数配置:压测时长、步长、超时时间这些“火候”参数要预先设定。一份完整的场景模型,就是一场可被重复执行的“彩排脚本”。

菜单越贴近真实,彩排结论就越经得起开业考验。如果场景模型里只有“清一色的短请求”,那么压测报告再漂亮,也只是一份自欺欺人的假菜单。

R=NT\text{R} = \frac{N}{T}
R 是压测时每秒发出的请求数,N 是这段时间发出去的总请求数,T 是压测持续的总秒数。它决定了我们往系统里倒多大的“客流”。
  1. 分子 N请求总数:压测脚本在整个过程中总共发起了多少次请求,就像彩排中一共上了多少桌菜。
    NN
  2. 分母 T压测时长:从第一个请求发出到统计结束的持续时间,单位是秒,相当于彩排从迎客到打烊的总时长。
    TT
  3. 整体 R平均请求速率:N 除以 T 得到每秒的请求数,也就是施加给系统的“客流强度”。
    R=NT\text{R} = \frac{N}{T}

并发梯度策略

开业彩排不能一开门就涌进一千人——后厨会瞬间被压垮,而且你根本分不清是灶台不够、还是传菜通道太窄。聪明的店主会分批放客:二十桌跑一轮、五十桌跑一轮、一百桌再跑一轮。这就是并发梯度的思想:从低到高、阶梯式地增加并发用户数,每一档停留一段时间采集数据,观察系统在每个压力档位下的反应。

具体策略有四种。阶梯式加压是最常规的做法:每档稳住几十秒,让指标充分暴露再进入下一档。突增式冲击则模拟秒杀、抢购这类瞬间流量,在极短时间把并发顶到高位,测试系统能否扛住“人来疯”。阈值区间探测是在疑似拐点附近用二分法加密测量,像试菜一样一点点加盐,找到味道刚好翻车的那个点。一旦系统过载,还要执行回退与恢复:阶梯式撤掉并发,观察吞吐和延迟能否回到健康水位——这决定了系统在真实故障后能否自愈。

一桌一桌地加人,才能知道第几桌客人开始让厨房冒烟。梯度加压不仅是保护系统的手段,更是绘制吞吐曲线的“逐点采样器”——没有梯度,拐点就无处藏身。

stepi=base×ratioi\text{step}_{i} = \text{base} \times \text{ratio}^{i}
第 i 档的并发数等于起始档位 base 乘以档位增长率 ratio 的 i 次方,用来设计“从多少桌开始、每轮加几桌”。
  1. base起始并发档位:压测的第一档并发数,通常设为一个很小的值,让系统在低压下完成热身。
    base\text{base}
  2. ratio档位增长率:每一档相比上一档放大多少倍,比如 1.5 表示每轮增加 50% 的并发。
    ratio\text{ratio}
  3. step_i第 i 档并发数:用 base 乘上 ratio 的 i 次方,得到第 i 档的目标并发,形成一条平滑向上的梯度曲线。
    stepi=base×ratioi\text{step}_{i} = \text{base} \times \text{ratio}^{i}

吞吐量指标

出菜速率不会一直随着客人数量上涨。客人太少时厨师闲着,加人出菜就变快;客人太多时传菜通道拥堵、厨师互相抢灶台,出菜速率反而下降。衡量“这间厨房最高能稳定出多少菜”的核心指标,就是QPS(每秒完成的请求数)。但只看 QPS 远远不够,它必须和延迟、错误率放在一起看,才能还原真实的系统状态。

这里有一个极其经典的公式——Little 定律:系统内同时等待处理的请求数,等于吞吐率乘以平均响应时间。假如延迟飙高而吞吐不变,系统里的积压请求会成倍膨胀,像等位区越挤越多人。压测的核心目标之一就是找到拐点:吞吐量从线性增长转为平缓、再从平缓转为下降的那个并发点。拐点之前是健康区,拐点之后进入饱和区,此时错误率抬头、延迟雪崩,用户体感急剧恶化。

拐点就是厨房的“小宇宙爆发上限”。越过它之后,继续塞客人不仅不会出更多菜,反而会让整个后厨系统陷入排队内耗——这正是吞吐量压测最想抓住的那个危险信号。

L=λ×WL = \lambda \times W
L 是系统里平均同时存在的请求数,λ 是每秒完成的请求数(吞吐量),W 是每个请求的平均耗时。L=λW 是理解“为什么延迟一涨、系统就积压”的钥匙。
  1. λ吞吐率:单位时间完成的请求数量,相当于厨房每小时端出菜的份数。
    λ\lambda
  2. W平均响应时间:每个请求从发出到完成所经历的平均秒数,相当于一道菜从下单到上桌的平均时长。
    WW
  3. L系统内并发请求数:λ 与 W 相乘得到系统里同时存在的平均请求数量,也就是等位区里平均坐了多少桌人。
    L=λ×WL = \lambda \times W

瓶颈定位

满座时发现上菜速度提不上去,可能是灶台太少(CPU 不足)、可能是传菜生跑不过来(网络 IO 不够)、也可能是冰箱到灶台之间路太窄、大家都在排队取料(锁竞争)。每条线索都要单独检查,这叫瓶颈定位——沿请求链路逐层排查,找到那个真正“卡脖子”的环节。

定位瓶颈有四步操作。分层排查从客户端超时现象入手,依次核查网关、推理服务、模型执行引擎和存储,每一层记录延迟分布,缩小嫌疑范围。资源水位分析看 CPU、GPU、内存、磁盘与网络的使用率:如果 CPU 已打满而吞吐停滞,计算资源就是瓶颈;如果 CPU 只有 40% 而吞吐已到顶,说明请求在等待锁、连接池或外部 IO。锁与连接池是 AI 服务里最隐蔽的瓶颈,线程互相等待会让 CPU 空闲、吞吐停滞,看似“没资源”实则“资源被堵住”。最后要用根因验证收尾:针对嫌疑环节单独压测或加日志,确认它确实是瓶颈,而不是“凭感觉背锅”。

厨房的每一次“卡菜”,都要拆到底,看到底是哪个环节在拖后腿。只有把瓶颈钉死在某个具体组件上,扩容和优化才有的放矢——否则就是把钱花在换更贵的灶台上,结果发现堵点其实在传菜口。

U=λμU = \frac{\lambda}{\mu}
U 是资源利用率,λ 是请求到达率,μ 是该资源的服务率。当到达率逼近甚至超过服务率(U 接近 1),排队就会无止境。
  1. λ请求到达率:单位时间到达该环节的请求数量,相当于传菜生每秒送到传菜口的菜品数。
    λ\lambda
  2. μ资源服务率:该环节单位时间最多能处理的请求数量,相当于灶台每秒最多能炒出的菜数。
    μ\mu
  3. U资源利用率:λ 除以 μ 得到利用率。U 越接近 1,该环节越接近满负荷,超过 1 后队列长度就会无限增长。
    U=λμU = \frac{\lambda}{\mu}

容量规划

彩排结束,老板手里有了一张“厨房能力表”:最多同时接待 300 桌、稳定出菜 400 份一小时。现在要做的决定是——周末晚高峰可能来 350 桌,要不要添炉灶?这个从压测结果到扩容决策的过程,就是容量规划。

容量规划分四步。结果汇总要先整理压测中的最大有效吞吐、SLO 边界并发和错误率曲线,而不是只看 QPS 峰值。容量估算用业务预估峰值乘以预留缓冲系数,比如预估峰值 800 QPS、预留 30% 缓冲,目标容量就是 1040 QPS。扩缩容建议遵循“水平扩展优先、垂直扩展其次”:多挂几个无状态推理实例通常比把单机从 8 核升到 16 核更灵活。最后是成本权衡:多一台 GPU 实例每月多少钱,比一比流量高峰打垮服务带来的损失,用数字说话。

不是厨房越大越好,够用且留有余地,才叫会经营。容量规划的智慧在于:既不因为压测出 1000 QPS 就盲目扩到 2000,也不因为省钱而把系统撑到拐点边缘。

QPSneed=QPSpeak×(1+buffer)\text{QPS}_{\text{need}} = \text{QPS}_{\text{peak}} \times (1 + \text{buffer})
容量规划的目标值等于预估峰值吞吐乘以(1 + 预留缓冲比例)。缓冲是用来吸收流量突发和单点故障的“安全垫”。
  1. QPS_peak业务预估峰值:根据历史流量和业务增长预测出的最高吞吐需求。
    QPSpeak\text{QPS}_{\text{peak}}
  2. buffer预留缓冲比例:为应对流量抖动和故障转移而多留的余量,通常取 20% 到 50%。
    buffer\text{buffer}
  3. QPS_need目标容量:二者相乘得到部署应具备的吞吐能力,作为扩容的量化依据。
    QPSneed=QPSpeak×(1+buffer)\text{QPS}_{\text{need}} = \text{QPS}_{\text{peak}} \times (1 + \text{buffer})

监控配置

现代化的厨房里到处是仪表:灶台温度、备菜时长、传菜生步数、顾客等待时间。哪项指标异常,警报铃立刻响起——否则火情烧到屋顶才发现。AI 服务同样需要一套监控配置,在压测和运行时持续观察系统健康度。

监控配置分四层。业务指标监控盯的是 QPS、错误率、p95/p99 延迟,这些直接反映用户体感。系统资源监控覆盖 CPU、内存、GPU、磁盘与网络,回答“资源用到了什么程度”。告警阈值设定要围绕 SLO 设置,比如“p95 延迟超过 500ms 持续 5 分钟”或“错误率高于 5%”才触发,避免偶发抖动刷屏误报。观测面板把以上指标绘制成实时曲线,压测过程中肉眼捕捉拐点,生产中持续观察水位变化。

没有仪表盘的厨房,着了火都不知道。监控配置是压测的眼睛,也是生产环境的守夜人——它让每一次吞吐异常都有迹可循,让每一个告警都对应一个可行动的阈值。

SLO达标率=NokNtotal×100%\text{SLO达标率} = \frac{N_{\text{ok}}}{N_{\text{total}}} \times 100\%
SLO 达标率 = 满足延迟/错误率目标的请求数 ÷ 总请求数。它衡量的是“在多大比例上体验是合格的”。
  1. N_ok达标请求数:在 SLO 边界内的请求数量,比如 p95 延迟在 500ms 以内的请求。
    NokN_{\text{ok}}
  2. N_total总请求数:统计周期内的全部请求数量,是分母,代表整体样本。
    NtotalN_{\text{total}}
  3. 达标率两者相除并乘 100%,得到一个百分比。99% 达标意味着每一百个请求里最多一个“超时翻车”。
    SLO达标率=NokNtotal×100%\text{SLO达标率} = \frac{N_{\text{ok}}}{N_{\text{total}}} \times 100\%

自动化流水线

好的餐厅会把“满座彩排”变成制度:每周二打烊后,自动放一轮客人、自动记录出菜数据、自动对比上周水平。上周能出 600 份菜,这周降到 500,系统直接消息提醒店长。这就是自动化压测流水线——把压测的场景、执行、采集、对比固化成一条定时运行的流水线,让性能守护不再依赖某个工程师“想起来才测”。

流水线由四块拼成。任务编排用脚本串联起环境准备、数据灌入、压测执行、指标采集和报告生成,每个环节像流水线上的工位一样职责清晰。定时触发通常选在夜间低峰,避免压测流量干扰在线服务。结果归档把每次压测的指标存成历史基线,方便横向比较趋势。回归守护是流水线的守门员:新模型版本上线前自动跑一轮压测,如果吞吐量相比基线下降超过阈值,就拦截发布,把性能衰退挡在线上之前。

把经验沉淀为制度,让每一次代码变更都自动过一遍“厨房彩排”。自动化流水线的终极价值是:性能问题从“事后救火”变成“事前拦截”,让 AI 服务的每一次迭代都站在可验证的吞吐基线上。

reg=∣QPSnew−QPSbase∣QPSbase\text{reg} = \frac{|\text{QPS}_{\text{new}} - \text{QPS}_{\text{base}}|}{\text{QPS}_{\text{base}}}
reg 是回归变化率,用新版本吞吐量减基线吞吐量取绝对值,再除以基线,得到一个百分比,用来判断“变化有多大”。
  1. QPS_base基线吞吐量:历史上稳定版本的压测吞吐,被当作“及格线”和参照系。
    QPSbase\text{QPS}_{\text{base}}
  2. QPS_new新版本吞吐量:当前待验证版本的压测结果,可能是变更后的模型或代码。
    QPSnew\text{QPS}_{\text{new}}
  3. reg回归变化率:差值绝对值除以基线,得到一个 0% 到 100% 的波动幅度。超过预设阈值(比如 5%)就判定为性能退化,流水线报警并拦截发布。
    reg=∣QPSnew−QPSbase∣QPSbase\text{reg} = \frac{|\text{QPS}_{\text{new}} - \text{QPS}_{\text{base}}|}{\text{QPS}_{\text{base}}}

AI 应用场景

大模型推理服务上线前容量评估

阶段:性能测试与容量规划

解决的问题:新模型上线前不知道要部署多少张 GPU 卡。传统做法是靠经验拍脑袋,上线后流量一涨就触发限流,用户体验直线下降。吞吐量压测用场景模型模拟真实业务流量,测出单实例的最大有效吞吐,再乘上预留缓冲,精确推导出所需实例数。

具体案例:某团队上线一个 70B 参数大模型服务,压测发现单卡实例在并发 32 时 QPS 为 18、p95 延迟 380ms,而业务预估峰值是 800 QPS。按 30% 缓冲计算需要约 58 个实例,比拍脑袋的 80 个省下 27% 的 GPU 成本,又比保守方案的 40 个更安全。

大促流量洪峰前的全链路压测

阶段:负载测试与容量规划

解决的问题:电商大促、热点事件这类流量尖峰,会让 AI 推荐/风控服务瞬间被打满。传统方式不敢压真实链路,怕压垮生产。吞吐量压测通过突增式冲击策略,在预发环境模拟秒杀流量,找出网关、模型、存储各层的拐点,提前扩容并配置限流降级预案。

具体案例:某电商平台的 AI 客服在大促前使用“阶梯加压 + 突增冲击”组合压测,发现当并发突破 1200 时,对话模型服务的 p95 延迟从 300ms 暴涨到 2 秒。团队据此提前把该服务从 20 个 Pod 扩到 35 个,大促当天峰值 1100 并发平稳通过,零故障。

模型版本迭代的性能回归守护

阶段:自动化测试与持续集成

解决的问题:模型迭代频繁,新版本可能提升精度却拖慢推理速度。传统方式靠人工在发版前想起来才测,漏掉一次就可能在线上酿成性能事故。自动化压测流水线把压测嵌入 CI/CD,每次提交新模型都自动跑一轮,对比基线吞吐,下降超过 5% 直接阻断合并。

具体案例:某 AI 公司上线自动化流水线三个月,成功拦截了 4 次性能退化。最典型的一次是蒸馏版模型声称“体积减半、速度不变”,回归压测发现实际吞吐下降了 18%,流水线自动报警,团队回滚并重新优化算子。

Python 演示

python63 行
"""吞吐量压测模拟与容量规划演示 用简化数学模型模拟一次压测: 每给定一个并发水平, 返回该状态下的QPS吞吐量、p95响应延迟和错误率, 再根据SLO自动给出容量建议。"""import math  class LoadSimulator:    """模拟一个AI推理服务的压测过程     concurrency_peak表示吞吐达到最高的并发点, 超过后系统进入过载区。    """     def __init__(self, max_qps=600, base_latency_ms=80, concurrency_peak=400):        self.max_qps = max_qps        self.base_latency_ms = base_latency_ms        self.concurrency_peak = concurrency_peak     def run(self, concurrency):        """给定并发值, 返回(吞吐qps, p95延迟ms, 错误率)"""        if concurrency <= self.concurrency_peak:            qps = min(concurrency * 1.5, self.max_qps)            error = 0.0        else:            overload = (concurrency - self.concurrency_peak) / self.concurrency_peak            qps = self.max_qps * math.exp(-0.5 * overload)            error = min(0.9, max(0, (concurrency - 650) / 2000))        latency = self.base_latency_ms * math.exp(concurrency / 520)        return qps, latency, error  def find_optimal(sim, max_concurrency=1200, slo_latency_ms=500, slo_error=0.05):    """线性扫描并发水平, 返回满足SLO且有效吞吐最大的压测点"""    best = None    for concurrency in range(50, max_concurrency + 1, 50):        qps, latency, error = sim.run(concurrency)        if latency <= slo_latency_ms and error <= slo_error:            effective = qps * (1 - error)            if best is None or effective > best[2]:                best = (concurrency, qps, effective, latency, error)    return best  def main():    sim = LoadSimulator()    print("=== 压测曲线: 并发, QPS, p95延迟ms, 错误率 ===")    for concurrency in range(50, 1001, 50):        qps, latency, error = sim.run(concurrency)        print("%5d  %8.1f  %8.1f  %6.1f%%" % (concurrency, qps, latency, error * 100))     best = find_optimal(sim)    if best:        concurrency, qps, effective, latency, error = best        print("\n=== 容量建议 ===")        print("推荐安全并发: %d" % concurrency)        print("对应吞吐: %.1f QPS" % qps)        print("有效吞吐: %.1f QPS" % effective)        print("预留30%%缓冲后需支撑: %.0f QPS" % (effective * 1.3))  if __name__ == "__main__":    main()
目的:用数学模型模拟压测曲线,在给定 SLO(延迟 ≤ 500ms、错误率 ≤ 5%)条件下,自动找到吞吐量最大且不违规的“安全并发点”,并输出容量建议。
  1. class LoadSimulator:用类封装压测模型,方便复用它来跑不同参数的服务
  2. def run(self, concurrency):核心方法,输入一个并发值就返回(QPS、延迟、错误率)三元组
  3. qps = min(concurrency * 1.5, self.max_qps)未饱和区吞吐随并发线性增长,但被最大 QPS 封顶
  4. qps = self.max_qps * math.exp(-0.5 * overload)过载区吞吐指数衰减,模拟排队拥堵导致出菜变慢
  5. latency = self.base_latency_ms * math.exp(concurrency / 520)延迟随排队呈指数增长,这是 SLO 被打破的主因
  6. effective = qps * (1 - error)有效吞吐会因错误率打折,这才是用户真正“吃到的菜”
  7. if best is None or effective > best[2]:在满足 SLO 的点里只保留有效吞吐最大的那一个
  8. print("%5d %8.1f %8.1f %6.1f%%" % (concurrency, qps, latency, error * 100))格式化输出压测表,便于人工核对拐点位置

常见误区

误区很多初学者以为压测就是拼命加并发,并发越高系统越“有劲”,QPS 一定能冲到更高。压测报告里顶到 2000 并发,就觉得系统很强大。

正解这就像往厨房里塞进 1000 桌客人——传菜通道马上堵死,厨师互相撞车,出菜速率反而下跌。吞吐量随着并发先增长、到拐点后饱和、过饱和后下降,是一条倒 U 形曲线。压测的目标不是“扛住多少并发”,而是找到吞吐量最高的那个“安全并发点”,并确认该点延迟和错误率都在 SLO 之内。

为何常见:因为人天然用“数量多 = 能力强”来理解系统,忽略了排队和资源竞争会带来负反馈。

误区压测报告里只盯着 QPS 数字,觉得“QPS 500 就是比 300 好”,完全不看响应延迟和错误率。

正解QPS 再高,如果 p95 延迟已经冲到 2 秒,用户早就等不及流失了。出菜速率再高,每道菜都要等一小时,客人照样掀桌。性能评估必须用“有效吞吐”——在满足延迟 SLO 和错误率上限前提下的吞吐,才是真实可用的能力。判卷不能只看答了多少题,还得看正确率。

为何常见:QPS 是单个数字、简单直观,而延迟分布是曲线、需要多看一眼,人天然倾向用简单指标做判断。

误区压测时 CPU 利用率只有 40%,就觉得“离瓶颈还远着呢”,一股脑继续往上加并发,结果吞吐纹丝不动。

正解CPU 没满但吞吐到顶,恰恰是典型的“隐蔽瓶颈”信号——请求很可能被堵在锁等待、数据库连接池耗尽、网络 IO 或磁盘 IO 上。就像厨师都闲着,但传菜通道被堵死,菜一样出不去。瓶颈定位必须分层排查,不能只看一个资源指标就下结论。

为何常见:CPU 是最常被提及的计算资源,初学者习惯性地把“CPU 满”当作“系统满”的唯一标准。

误区压测测出最大 QPS 是 1000,就直接按 1000 去规划生产容量,一点余量不剩。

正解压测结果是在理想测试环境下的极限值,生产环境会有流量抖动、单实例故障、突发热点等意外。若把系统撑在极限运行,任何小波动都会把延迟打到 SLO 之外。正确做法是在压测峰值上再加 20%~50% 的缓冲,同时预留故障转移的能力,就像厨房按 350 桌备料、而不是按刚好 300 桌。

为何常见:压测数字看起来精确,让人误以为“测得准就能按极限用”,忽略了现实世界的随机性。

误区为了“高效”,直接把并发从 0 拉到最高水平,想一次试出系统极限,结果系统瞬间被打挂,还什么都没测出来。

正解一次性突增就像把 1000 个客人同时塞进门,后厨直接瘫痪,你连瓶颈在哪都看不到。阶梯式加压让系统在每个档位充分暴露状态,才能画出吞吐曲线、找到拐点;突增冲击要作为专项测试单独做,而不是作为常规压测的默认方式。压测不是飙车,而是逐档加码的“路试”。

为何常见:人容易把“快”和“好”画等号,想省时间却忽略了压测本身需要观察过程、记录曲线。

面试题

Q1. 吞吐量压测最关注的核心目标是?

单选题 · easy

  • A.验证功能逻辑正确
  • B.测量系统最大处理能力← 正确答案
  • C.检查代码书写规范
  • D.降低服务器采购成本

答案:B。吞吐量压测本质是给系统做“满座彩排”,核心目标是测出每秒最多能处理多少请求(QPS)。功能正确性是功能测试的职责,代码规范是代码评审的职责,降低成本是容量规划的结果而非压测目标。

Q2. 压测中 QPS 指标的具体含义是?

单选题 · easy

  • A.每秒完成的请求数← 正确答案
  • B.每秒新建的连接数
  • C.每分钟处理的总量
  • D.用户每秒的排队数

答案:A。QPS 是 Queries Per Second,指系统每秒成功完成的请求数量,相当于厨房每小时端出的菜品数。新建连接数叫 CPS,每分钟总量单位不对,“排队数”是并发等待量而不是完成量,均不符合定义。

Q3. 系统未饱和时,吞吐量与并发用户数通常呈什么关系?

单选题 · mid

  • A.二者几乎毫不相关
  • B.近似线性增长关系← 正确答案
  • C.指数快速下降关系
  • D.严格反比递减关系

答案:B。在系统资源充裕的未饱和区,每个新增加的并发请求都能被及时处理,吞吐量随并发近似线性上升,就像客人一多、灶台正好被填满,出菜速率跟着涨。饱和后会增速放缓,过载后下降,但那是拐点之后的事。

Q4. 压测发现并发到 400 时 p95 延迟已超过 SLO,此时正确的做法是?

单选题 · mid

  • A.继续加压以冲击更高峰值
  • B.安全并发定位在 400 以下← 正确答案
  • C.忽略延迟只关注吞吐量
  • D.立即停止压测不再分析

答案:B。SLO 是服务承诺的“及格线”,延迟超标意味着用户体感不可接受,这个并发点已经“翻车”。安全容量应在拐点或 SLO 边界之下留出余量,就像厨房发现 35 桌时上菜已超时,就应按 30 桌接客。

Q5. 阶梯式加压相对一次性突增的最大优势是?

单选题 · mid

  • A.节省构建压测脚本的时间
  • B.能识别拐点并保护系统← 正确答案
  • C.不需要额外的监控指标
  • D.可以跳过瓶颈定位环节

答案:B。阶梯加压相当于逐桌放客,每个档位都能采集一组稳定的指标,从而精确画出吞吐曲线、找到拐点,同时避免瞬间压垮系统。突增冲击虽然也能测极限,但无法精细地观察“哪一档开始恶化”。

Q6. 根据 Little 定律 L=λW,当吞吐量 λ 不变、平均响应时间 W 翻倍时,系统内平均并发请求数 L 会如何变化?

单选题 · extreme

  • A.系统内并发请求数不变
  • B.系统内并发请求数翻倍← 正确答案
  • C.系统内并发请求减半
  • D.系统吞吐量自动提升

答案:B。L=λ×W 是乘法关系,λ 固定而 W 翻倍,L 必然翻倍。这意味着即使每秒完成的请求数不变,只要延迟变慢,系统里堆积的请求就会成倍增加,等位区越来越挤。这解释了为什么延迟超标会导致系统积压恶化——它是性能分析中最基本的杠杆公式。

Q7. 容量规划中“预留缓冲”的主要意义是?

单选题 · easy

  • A.让压测数据更好看
  • B.应对突发流量与冗余← 正确答案
  • C.降低测试环境成本
  • D.减少告警配置次数

答案:B。压测得到的是极限值,生产环境有流量尖峰、单机故障、代码变更等因素干扰。预留 20%~50% 缓冲就像厨房按 350 桌备料而非 300 桌,给意外留出余地。容量规划的目标是“够用且安全”,不是贴着极限走钢丝。

Q8. 吞吐量压测结果应综合哪些指标进行判断?

多选题 · mid

  • A.QPS 吞吐量指标← 正确答案
  • B.延迟与错误率数据← 正确答案
  • C.资源利用率曲线← 正确答案
  • D.压测脚本注释数量

答案:ABC。有效吞吐 = QPS ×(1 − 错误率),且延迟必须满足 SLO,三者共同决定系统“真实可用”的能力;资源利用率则帮助定位瓶颈方位。脚本注释数量跟系统性能毫无关系,属于干扰项。

Q9. 自动化压测流水线应包含哪些核心环节?

多选题 · hard

  • A.定时触发压测任务← 正确答案
  • B.结果与基线自动对比← 正确答案
  • C.异常时自动报警← 正确答案
  • D.手动记录压测结论

答案:ABC。自动化流水线的核心价值是把触发、执行、对比、告警串成闭环,靠定时任务自动跑压测、自动和基线比较、超阈值自动报警。手动记录违背了“自动化”的初衷,属于人工干预的退化。

Q10. 设计吞吐量压测的场景模型时需要考虑哪些要素?

多选题 · hard

  • A.请求的分布特征建模← 正确答案
  • B.测试数据的规模与分布← 正确答案
  • C.业务的峰谷周期节奏← 正确答案
  • D.服务器机箱的颜色

答案:ABC。场景模型要还原真实客流——请求类型与 Token 长度分布(A)、测试数据贴近生产(B)、业务峰谷节奏(C)共同决定压测流量是否可信。机箱颜色属于物理外观,与负载模型完全无关。