想象你是餐厅老板,明天要承办一场万人宴席。你心里没底:后厨一小时能出多少菜?客人下单后多久能上齐?如果两千人同时涌进来,是先变慢还是直接崩溃?这些问题光靠“感觉”回答不了,需要一场正式考核——这就是性能测试。它不关心菜好不好吃(功能对不对),只关心在多少客人、什么节奏下,餐厅能否按承诺的速度和数量出菜,以及哪个环节最先撑不住。本篇以“餐厅大考”为主线:先分清四类考核(测试类型),再定好四把尺子(核心指标),接着写客流剧本(场景设计),揪出后厨瓶颈(瓶颈分析),建立正常水位和回归防线(基线回归),最后聊聊工具与落地(工具实践)。读完,你就能用这套思路给 AI 服务或线上系统做一次像样的压力体检。

岗位关联

掌握性能测试的方法与指标分析,你就能在 AI 服务上线前发现延迟与容量风险,用数据说服团队,守住系统质量底线——这是性能工程师与 SRE 的核心竞争力。

目录
  1. 可视化演示
  2. 一、测试类型:先想清楚考什么
  3. 二、核心指标:定好四把尺子
  4. 三、场景设计:写好客流剧本
  5. 四、瓶颈分析:揪出拖后腿的环节
  6. 五、基线回归:记住正常水位
  7. 六、工具实践:把体检变成日常
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示负载测试、压力测试、尖峰测试与容量测试四种性能测试方法的负载曲线、关键指标(p50/p95/p99/RPS)及崩溃点与拐点定位。

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

负载测试与基线建立 阶梯负载逐步加压,定位性能拐点建立正常容量基线 基线 = f(RPS, P99, CPU) 负载测试通过逐步加压发现性能随负载变化的曲线。

一、测试类型:先想清楚考什么

办宴席前要先想清楚考什么:平时晚饭高峰期算“日常考核”,硬塞两倍座位的人进来算“极限考核”,婚宴开始时宾客一窝蜂涌进来算“突发考核”,而把餐厅座位、后厨产能加满还能接多少客人,则是“容量摸底”。这四种玩法,正是性能测试的四大类型。

负载测试(Load Testing)在预期的业务量下验证系统表现是否符合约定,像让餐厅坐满预定人数的客人看能不能接住;压力测试(Stress Testing)则不断加压直到系统崩溃或急剧恶化,找出极限与恢复能力,像硬塞两倍客人看什么时候垮;尖峰测试(Spike Testing)模拟流量在极短时间内暴涨,比如婚宴开席时一瞬间涌进大堂;容量测试(Capacity Testing)回答“最多能撑多少人”,为扩容规划提供依据。

四者的核心区别在于“负载水平”与“时间形态”:负载测试不超过预期峰值,压力测试显著超过预期;尖峰测试的负载呈骤升骤降的脉冲形态,压力测试的负载则持续高位。实践中通常先用负载测试建立基准,再用压力测试寻找拐点。响应时间随负载变化的典型形态,可以用分段模型来描述:拐点前平缓上升,拐点后急剧恶化。

所以四类测试就像四种考核剧本:日常考核看是否达标,极限考核找崩溃边缘,突发考核看恢复弹性,容量摸底定扩建方案。搞清考什么,才能设计好接下来的“考场”。

R(n)=R0+a⋅n+b⋅(n−nk)2⋅1(n>nk)\displaystyle R(n)=R_0+a\cdot n+b\cdot\left(n-n_k\right)^2\cdot\mathbf{1}\left(n>n_k\right)
这个分段模型的意思是:客人少时,上菜时间随人数缓慢变长(对应 $a\cdot n$ 那段);一旦客人超过拐点 $n_k$,上菜时间会像失控一样飞速上升(平方项开始发力)。找到这个拐点,就找到了系统的真实边界。
  1. 基准响应时间 $R_0$系统空载或负载极低时的基础耗时,对应餐厅没有客人时的出菜底速。
    R0R_0
  2. 线性增长项 $a\cdot n$负载逐渐上升时,排队效应让响应时间平稳变长,像客人增多后上菜渐渐变慢。
    a⋅na\cdot n
  3. 拐点负载 $n_k$系统由“从容”转向“吃力”的临界负载,是压测最想找到的阈值。
    nkn_k
  4. 二次恶化项 $b\cdot\left(n-n_k\right)^2$超过拐点后响应时间以平方级加速上升,如同后厨彻底堵死。
    b⋅(n−nk)2b\cdot\left(n-n_k\right)^2
  5. 指示函数 $\mathbf{1}(n>n_k)$保证平方项只在超过拐点后生效,拐点之前不参与计算。
    1(n>nk)\mathbf{1}(n>n_k)

二、核心指标:定好四把尺子

判断一场宴席办得怎么样,食客最直观的感受是“菜多久上齐”,老板看的是“一小时出了多少桌”,后厨看的是“炉灶和厨师忙不忙”,店长还要盯“有没有上错菜、退菜”。这四件事,恰好对应性能测试的四大指标:响应时间、吞吐量、资源利用率、错误率。

响应时间(Response Time)指从发起请求到收到完整响应的耗时,通常包含服务时间、排队时间和网络传输时间;吞吐量(Throughput)指单位时间内成功完成的请求数,常用 TPS(每秒事务数)表示;资源利用率指 CPU、内存、磁盘 I/O、网络等软硬件被消耗的比例;错误率指失败请求占总请求的比例,是稳定性最直接的风向标。

四个指标不是孤立的,其中最有用的一条关系是利特尔定律(Little's Law):在稳定系统中,并发数等于吞吐率乘以平均响应时间。比如线上观测到平均响应时间 200 毫秒、每秒处理 500 个请求,那么系统中平均在途请求约 100 个。已知任意两个量,就能推出第三个。

值得注意的是,平均值会骗人——高峰排队时少数请求可能慢上十倍。真正该盯的是 P95、P99 分位值,就像判断上菜速度,与其看平均,不如问“最慢的那 5% 客人等了多久”。尺子选对了,餐厅好不好才说得准。

L=λ×W\displaystyle L=\lambda\times W
利特尔定律就像餐厅的“订单守恒”:后厨同时做着的菜数(并发数)等于每小时上菜数(吞吐率)乘以每道菜平均耗时(响应时间)。盯住两个量,就能推算第三个量。
  1. 并发数 $L$系统中同时在途(正在处理或排队)的请求数量,如同后厨里同时催着出菜的订单数。
    LL
  2. 吞吐率 $\lambda$单位时间完成并返回的请求数,对应餐厅每小时真正上齐的菜数。
    λ\lambda
  3. 平均响应时间 $W$每个请求从发出到返回的平均耗时,对应每道菜从下单到上桌的平均时间。
    WW
  4. 乘积关系 $\lambda\times W$稳定状态下吞吐率与响应时间相乘等于并发数,三个量知二求一。
    λ×W\lambda\times W

三、场景设计:写好客流剧本

考试剧本要写清楚:来多少客人、以什么节奏来、点什么菜、后厨备了什么食材。压测场景设计就是在回答这些问题,对应的四个要素是:测试模型、并发估算、思考时间和数据准备。

测试模型要贴合真实业务:读写比例、接口权重、高峰时段都要从生产数据统计而来,而不是拍脑袋平均分配。并发估算常用公式 $C=U\times P$:$U$ 是在线用户数,$P$ 是同一时刻真正发请求的活跃比例。思考时间(Think Time)则模拟用户阅读页面、敲键盘的间隔,拉大请求节奏,让流量更像真人。

数据准备是最容易被忽视的一环:压测数据要贴近生产的数据量与分布,否则缓存命中率、索引选择性都会失真。比如一张大表只有 1 万行和 1000 万行,SQL 执行计划可能完全不同,压出来的结果自然没有参考价值。此外还要避免脏数据污染压测结果,并留意压测数据本身消耗的存储空间。

剧本写得像真人真事,压测结果才可信。如果压测脚本里的“客人”全是一秒点一次的机器人,测出来的“上菜速度”只会吓坏自己,也无法指导真实容量决策。

C=U×P\displaystyle C=U\times P
并发估算就像计算宴席上“同一时刻有多少人在招手点菜”:满堂客人有 1000 位(在线用户数),但真正同时举手点菜的也许只有 30%(活跃比例),那么需要服务的并发点单就是 300 份。
  1. 在线用户数 $U$系统中同时在线的总用户数,如同餐厅同时就座的全部客人。
    UU
  2. 活跃比例 $P$同一时刻真正发起请求的用户占比,通常远小于 1,因为多数人正在阅读和思考。
    PP
  3. 目标并发 $C$压测需要模拟的并发用户数,是场景设计的关键输入参数。
    CC

四、瓶颈分析:揪出拖后腿的环节

客人抱怨上菜慢,问题可能出在前台点单、后厨炒菜、排队传菜,甚至食材采购。性能分析同样要分层排查:接入层、应用层、数据库层、基础设施层,一层层缩小嫌疑范围,而不是瞎猜一通。

资源维度上,优先看四大类:CPU 是否打满、内存是否频繁 GC 或换页、磁盘 I/O 是否排队、网络带宽是否耗尽。很多症状都指向同一种根因——某个资源的利用率接近 100% 后,请求开始排队。用排队论的视角看,资源利用率 $U$ 等于请求到达率 $\lambda$ 除以服务率 $\mu$;利用率逼近 1 时,排队时间会急剧变长,响应时间中的 $R_q$ 部分随之失控。

常见瓶颈有规律可循:数据库连接池耗尽、锁竞争激烈、缓存未命中率飙升、日志同步写盘、线程池打满,都是实际项目里的高频问题。分析方法讲究“资源—链路”联动:先看资源哪个维度饱和,再结合链路追踪定位到具体调用,最后用日志确认根因。找到第一瓶颈并优化后,还要继续压测——因为瓶颈会转移,另一个环节可能变成新的短板。

瓶颈分析就像检修厨房管线:先看水表电表,再逐段查管道,最后在锈死的那一截换上新零件。每一次优化后都要重新压测,因为短板的接力棒总会传到下一个环节。

U=λμ,R=Rs+Rq\displaystyle U=\frac{\lambda}{\mu},\qquad R=R_s+R_q
这两条式子告诉我们要区分“忙”和“堵”:利用率 $U$ 接近 100% 时系统开始排队,而响应时间可以拆成真正干活的时间($R_s$)和排队等待的时间($R_q$)。客人等得久,先弄清楚是在被服务还是在干等。
  1. 请求到达率 $\lambda$单位时间到达系统的请求数,像每分钟涌进餐厅的客人数量。
    λ\lambda
  2. 服务率 $\mu$单个资源单位时间最多能处理的请求数,像一位厨师一分钟最多炒几道菜。
    μ\mu
  3. 利用率 $U$到达率与服务率的比值,逼近 1 时排队时间开始飙升。
    U=λμU=\frac{\lambda}{\mu}
  4. 服务时间 $R_s$请求真正被处理所消耗的时间,是“干活”的时间。
    RsR_s
  5. 排队时间 $R_q$等待资源空闲的时间,利用率过高时它是响应时间超长的主要元凶。
    RqR_q

五、基线回归:记住正常水位

餐厅要把“正常水平”记录在案:周日晚高峰平均出菜 8 分钟、P95 12 分钟。这就是性能基线。没有基线,任何性能异常都说不清是“变差了”还是“本来如此”。

基线要在稳定的测试环境、相同的硬件配置、固定的数据集下反复测量取稳定值,记录响应时间、吞吐量、资源利用率的快照。上线后通过持续监控跟踪生产环境的同类指标,把这份“体检档案”长期保存下来,形成系统的健康史。

每当发布新版本、改造架构或调整配置,都要重跑核心场景并与基线对比,这就是性能回归测试。对比结果用漂移率来度量:新值相对基线变化了多少百分比。通常漂移超过 20% 就判定性能回归,需要阻止上线并排查原因,而不是带着隐患进入生产。

基线就像餐厅的“标准菜谱”:改一道菜,必须重新尝一遍并对照标准口味。持续监控是每天的例行试菜,回归测试是每次改动后的终审——三者配合,才能守住质量底线。

D=Rnew−RbaseRbase×100%\displaystyle D=\frac{R_{new}-R_{base}}{R_{base}}\times100\%
漂移率像测体重变化:以基线体重为基准,涨了 20% 就要警惕。同样,新版响应时间比基线高出 20%,说明这次改动很可能引入了性能劣化。
  1. 基线响应时间 $R_{base}$稳定可控环境下测得并记录的正常水位,是后续所有对比的锚点。
    RbaseR_{base}
  2. 新版本响应时间 $R_{new}$代码变更或配置调整后重测得到的实际耗时。
    RnewR_{new}
  3. 漂移率 $D$新旧差异的百分比,超过约定阈值(常见为 20%)即判定为性能回归。
    D=Rnew−RbaseRbase×100%D=\frac{R_{new}-R_{base}}{R_{base}}\times100\%

六、工具实践:把体检变成日常

有了理论和指标,还要趁手的工具。压测工具负责“发客人”,监控工具负责“看仪表”,报告负责“给结论”。工具选型要看团队语言与场景:API 型服务适合轻量脚本化工具,协议复杂则选功能丰富的平台型工具。但要记住,工具只是手段,场景模型和指标解读才是核心。

监控体系建议配齐三件套:应用指标(响应时间、错误率、线程池状态)、系统资源(CPU、内存、磁盘、网络)、链路追踪(一次请求经过哪些服务、每段耗时多少)。三者配合才能把“慢”精准定位到具体环节。做容量规划时,用实测的单机吞吐推算所需节点数:目标吞吐除以单机吞吐,就是需要的实例数量。

报告输出要结论导向,采用“目标—场景—数据—结论—建议”五段式。给不同角色不同侧重:研发看瓶颈堆栈,运维看资源水位,管理层看是否满足 SLA 与扩容预算。更成熟的团队还会把压测嵌入 CI/CD 流水线,每次发版自动跑一轮冒烟级性能测试,让性能问题在合入主线前就被拦截。

工具与实践的终极目标,是把“压力体检”从上线前的一次性动作,变成持续运转的日常机制。餐厅要天天迎客,系统要天天上线——会体检、常体检,才能在下一次万人宴席来临时胸有成竹。

N=TPStargetTPSsingle\displaystyle N=\frac{TPS_{target}}{TPS_{single}}
容量规划像算宴会要雇几位厨师:目标是一小时出 500 道菜(目标吞吐),一位厨师一小时最多做 50 道(单机吞吐),那么至少需要 10 位厨师——还要再留些余量应对突发。
  1. 目标吞吐 $TPS_{target}$业务方要求的每秒事务数,来自 SLA 或流量预估,是规划的输入。
    TPStargetTPS_{target}
  2. 单机吞吐 $TPS_{single}$通过压测实测的单节点最大稳定吞吐,是规划的依据。
    TPSsingleTPS_{single}
  3. 节点数 $N$满足目标所需的实例数量,实际部署时常向上取整并留 20%~30% 冗余。
    N=TPStargetTPSsingleN=\frac{TPS_{target}}{TPS_{single}}

AI 应用场景

场景一:AI 推理服务上线前压测

阶段:模型部署与上线验证

解决的问题:大模型 API 不压测就上线,可能因并发过高导致首 token 延迟飙升、GPU 显存耗尽、超时雪崩。用负载测试摸清吞吐量与 P95 延迟的拐点,再按容量公式决定部署多少推理实例,就像在宴席开席前先试跑一遍满客情景。

具体案例:某 RAG 聊天机器人上线前,压测工程师以 20、40、80 并发逐级加压,发现 40 并发时 GPU 利用率冲到 95%、首 token 延迟从 0.8 秒涨到 3 秒,定位到推理批处理线程池过小。调优后系统稳定支撑 80 并发且延迟达标,顺利上线。

场景二:电商大促容量规划

阶段:容量规划与扩容决策

解决的问题:大促前不知道要买多少台机器,买少了宕机,买多了浪费。基于历史峰值 TPS 与单机压测能力,用 $N=\frac{TPS_{target}}{TPS_{single}}$ 推算节点数,再用尖峰测试验证弹性扩容能力,相当于大考前先算出要加几张桌子。

具体案例:某电商平台从监控得知去年双十一峰值 TPS 为 5 万,单机压测稳定吞吐 800 TPS,推算核心服务约需 63 台,再留 30% 冗余采购 82 台。大促当天实际最高水位 4.7 万 TPS,系统平稳度过。

场景三:发布流水线里的性能回归门禁

阶段:持续集成与发布门禁

解决的问题:每次代码变更都可能引入慢查询、连接池泄漏或内存膨胀,人工回归成本高。把核心场景压测写进 CI/CD 流水线,与基线自动对比,漂移超标即拦截发布,就像每次改菜单后自动试菜、超差就退菜。

具体案例:某支付网关把 5 条核心链路的压测放进流水线,某次发布后 P95 从 120ms 涨到 190ms,漂移率达 58%,流水线自动拦截。排查发现新增了 N+1 查询,修复后重新跑测通过才放行上线。

Python 演示

python87 行
import randomimport threadingimport timefrom collections import deque  class FakeServer(object):    # 模拟一个会过载的服务端: 排队越久延迟越高    def __init__(self, base_latency=0.02, max_workers=20):        self.base_latency = base_latency        self.max_workers = max_workers        self.active = 0        self.lock = threading.Lock()     def handle(self):        with self.lock:            self.active += 1            busy = self.active        try:            time.sleep(self.base_latency + random.uniform(0, 0.005))            if busy > self.max_workers:                time.sleep((busy - self.max_workers) * 0.01)            return True        finally:            with self.lock:                self.active -= 1  def run_load_test(server, concurrency=10, duration=2.0):    latencies = deque()    error_count = 0    lock = threading.Lock()    deadline = time.time() + duration     def worker():        nonlocal error_count        while time.time() < deadline:            start = time.time()            try:                server.handle()                latencies.append(time.time() - start)            except Exception:                with lock:                    error_count += 1     threads = [threading.Thread(target=worker) for _ in range(concurrency)]    for t in threads:        t.start()    for t in threads:        t.join()     ordered = sorted(latencies)    total = len(ordered)    if total == 0:        return {}    p50 = ordered[int(total * 0.50)]    p95 = ordered[int(total * 0.95)]    p99 = ordered[int(total * 0.99)]    tps = total / duration    return {        "tps": tps,        "p50": p50,        "p95": p95,        "p99": p99,        "error_rate": error_count / (total + error_count),    }  def main():    server = FakeServer(base_latency=0.02, max_workers=20)    print("=== Load test: restaurant kitchen check ===")    for users in [10, 20, 40, 80]:        res = run_load_test(server, concurrency=users, duration=2.0)        print(            "users={:>3d} TPS={:.1f} P50={:.3f}s P95={:.3f}s P99={:.3f}s error={:.1%}".format(                users,                res.get("tps", 0),                res.get("p50", 0),                res.get("p95", 0),                res.get("p99", 0),                res.get("error_rate", 0),            )        )  if __name__ == "__main__":    main()
目的:用多线程模拟并发用户,对一个可过载的假服务端逐级加压,计算 TPS、P50/P95/P99 分位延迟和错误率,演示一次完整的性能测试与拐点观察流程。
  1. self.active += 1加锁记录当前正在处理的请求数,模拟系统的在途并发。
  2. if busy > self.max_workers:超过处理能力后增加排队耗时,模拟现实中的过载退化。
  3. latencies.append(time.time() - start)记录每个请求从发出到返回的耗时。
  4. threads = [threading.Thread(target=worker) for _ in range(concurrency)]每个线程模拟一个并发用户,同时施压。
  5. ordered[int(total * 0.95)]用排序后的延迟序列取 P95 分位,避开平均值陷阱。
  6. tps = total / duration用完成请求数除以时长计算吞吐量。
  7. for users in [10, 20, 40, 80]:逐级加大并发,观察响应时间何时出现拐点。

常见误区

误区压测报告里平均响应时间只有 100ms,我觉得性能非常好,直接判定可以上线,完全不用看其他统计量。

正解平均值很容易被长尾掩盖:90% 的请求 50ms,10% 的请求 550ms,平均也能凑成 100ms,但真实用户里那 10% 已经卡到想摔手机。正确做法是同时看 P95、P99 分位数,就像餐厅该关心“最慢的那批客人等了多久”,而不是只报一个好听的平均数。

为何常见:平均数是日常生活中最熟悉的统计量,压测工具的默认输出也常带平均值,容易让人误以为它就是“代表性数字”。

误区反正要压测,就把并发线程数直接拉到 10000,看系统几秒挂掉,这样最省事、最接近真实极限。

正解盲目拉并发只是“压力测试”的一种形态,缺少场景设计的结果没有决策价值。正确流程是先根据业务模型估算目标并发,再决定用负载、压力、尖峰还是容量测试。每次压测前先问“我想回答什么问题”,而不是把机器往死里按。

为何常见:把“压测”字面理解为“狠压”,忽略了性能测试是为了容量决策、缺陷发现和回归保障服务的工程活动。

误区都是给系统加负载看表现,负载测试就是压力测试,只是叫法不同,完全没必要区分。

正解两者的目标本质不同:负载测试在预期范围内验证系统是否达标;压力测试超出预期范围,寻找崩溃点和恢复能力。好比考核餐厅,负载测试是“坐满平时客流看能不能接住”,压力测试是“硬塞两倍客人看什么时候垮掉、垮了能不能缓过来”。

为何常见:两种测试的操作流程和工具十分接近,都在不断加压,表现形态相似,初学者很容易混为一谈。

误区系统慢了就扩容,机器到位了性能自然就好了,不需要花时间分析瓶颈在哪。

正解无脑扩容可能只缓解表面症状;如果真实瓶颈在数据库连接池耗尽、锁竞争激烈或慢 SQL,加应用节点只会让下游更堵。正确流程是先分层定位第一瓶颈,再针对性优化,扩容只是手段之一。而且瓶颈会转移,优化完必须重新压测确认。

为何常见:“遇事不决加机器”在不少场景确实立竿见影,容易形成路径依赖,让人忽略根因分析才是瓶颈治理的核心。

误区上线前找一天晚上跑一次压测,报告归档进 wiki,之后就不用再管性能了。

正解性能会随代码变更、数据增长、流量结构变化而持续漂移。正确姿势是建立基线、持续监控生产指标,并让每次发布都跑回归对比,最好把压测嵌入 CI/CD 流水线。就像餐厅不能只在开业前测一次出菜速度,而是要天天记录、周周复盘。

为何常见:项目节奏一紧,性能问题常常拖到上线后才暴露,团队便把压测当成一次“过关检查”,忽略了它的长期保障价值。

面试题

Q1. 下列哪种测试类型用于验证系统在预期业务负载下的表现?

单选题 · easy

  • A.压力测试:寻找系统极限与崩溃点
  • B.负载测试:验证预期负载下的表现← 正确答案
  • C.尖峰测试:模拟流量瞬间涌入的场景
  • D.容量测试:确定系统最大可容纳容量

答案:B。负载测试在预期业务量下检验系统是否符合约定,如同餐厅坐满日常客流看能否接住。压力测试寻找极限,尖峰测试模拟骤增,容量测试确定上限,它们都不是针对“预期负载”的验证。

Q2. 利特尔定律 $L=\lambda\times W$ 中,$W$ 代表什么?

单选题 · easy

  • A.系统中的并发请求数量
  • B.单位时间完成的请求数
  • C.请求的平均响应时间← 正确答案
  • D.系统的资源利用率

答案:C。利特尔定律中,$L$ 是并发数,$\lambda$ 是吞吐率,$W$ 是平均响应时间。对应餐厅场景:$L$ 是后厨同时在做的订单,$\lambda$ 是每小时上菜数,$W$ 是每道菜平均耗时,三个量知二求一。

Q3. 压测报告中平均值很漂亮,为什么还要重点关注 P99?

单选题 · mid

  • A.平均值最容易计算和汇报
  • B.长尾慢请求被平均值掩盖← 正确答案
  • C.P99 一定比平均值更小
  • D.平均值只用于容量规划

答案:B。平均值会被长尾拖累或掩盖极端值,P99 反映最慢 1% 请求的体验。这就好比餐厅既要看平均上菜时间,更要问“最慢的那批客人等了多久”,P99 是真实体验的重要底线。

Q4. 压力测试的主要目标是什么?

单选题 · easy

  • A.验证预期业务负载下的表现
  • B.寻找系统极限与崩溃恢复点← 正确答案
  • C.模拟流量瞬间暴涨的场景
  • D.确定系统最大承载用户数

答案:B。压力测试把负载推到超出预期,目的是找到系统崩溃的边界以及崩溃后能否恢复。A 是负载测试的目标,C 是尖峰测试,D 是容量测试,三者与压力测试的定位不同。

Q5. 一条请求的响应时间通常包含哪些组成部分?

多选题 · mid

  • A.服务时间:真正处理请求的耗时← 正确答案
  • B.排队时间:等待资源释放的时间← 正确答案
  • C.网络时间:数据传输的往返耗时← 正确答案
  • D.思考时间:用户阅读页面的间隔

答案:ABC。响应时间由服务时间、排队时间和网络传输时间构成。思考时间是用户在两次操作之间的自然停顿,发生在请求之间,并不属于单次请求的响应时间,因此 D 不选。

Q6. 性能回归测试的核心价值是什么?

单选题 · mid

  • A.替代生产环境的日常监控
  • B.对比基线发现变更后的劣化← 正确答案
  • C.提高系统单机最大吞吐量
  • D.减少性能测试的执行次数

答案:B。回归测试的核心是把新版本结果与基线对比,发现引入的性能劣化。它不能替代日常监控,也不会直接提升吞吐量,更不是为了少做测试,而是为了守住每次上线的质量底线。

Q7. 尖峰测试与压力测试的本质区别在于?

单选题 · mid

  • A.尖峰测试关注骤增后的恢复← 正确答案
  • B.压力测试关注正常负载达标
  • C.两类测试完全没有任何区别
  • D.尖峰测试完全不关心指标

答案:A。尖峰测试模拟流量瞬间暴涨并观察系统能否快速恢复,压力测试则是持续超出预期的高负载下寻找崩溃点。二者负载形态不同,目标也不同。B 把压力测试说成正常负载校验是错误的。

Q8. 压测场景设计中需要重点准备的要素有哪些?

多选题 · easy

  • A.贴近生产的测试数据规模← 正确答案
  • B.基于业务模型估算并发← 正确答案
  • C.模拟真实节奏的思考时间← 正确答案
  • D.压测服务器的机箱品牌

答案:ABC。场景设计四要素是测试模型、并发估算、思考时间和数据准备。数据规模影响缓存命中率与索引选择,并发估算决定施压强度,思考时间决定流量节奏。服务器品牌与场景设计无关。

Q9. 拐点后响应时间急剧恶化,最适合用什么模型描述?

单选题 · hard

  • A.常数函数:响应时间保持稳定不变
  • B.分段函数:拐点后近似二次加速上升← 正确答案
  • C.线性函数:响应时间匀速升高
  • D.正弦函数:响应时间周期性波动

答案:B。拐点前响应时间近似线性增长,拐点后因排队失控进入二次甚至指数级恶化,因此用分段模型描述最贴切。常数、纯线性和正弦都无法刻画“拐点后急剧恶化”这一典型特征。

Q10. 关于性能基线与回归,下列说法正确的有哪些?

多选题 · hard

  • A.基线应在稳定可控环境中测量← 正确答案
  • B.性能漂移必须使用平均值判断
  • C.每次发布后应与基线进行对比← 正确答案
  • D.基线档案需要随版本持续更新← 正确答案

答案:ACD。基线必须在稳定环境、固定配置和固定数据下测量才有可对比性;每次发布后都要回归对比以发现漂移;基线也应随系统演进持续更新。判断漂移应综合分位数与误差率,而非只看平均值,因此 B 错误。