“跑到五千并发”很有冲击力,却没有说明请求是什么、持续多久、哪些响应算失败。对小型前端产品,压测更适合先回答一个具体问题:核心接口在约定负载下,是否满足可以解释的目标。
本文没有对线上服务发起压测,也没有提供容量成绩。下面区分策略、脚本与结果,避免把配置里的目标写成系统已经达到的能力。
阈值是政策,不是观察值
k6阈值文档将threshold作为通过或失败条件。把p95设为某个值,只表示你希望满足它;真正结果要来自运行。请求检查通过,也不代表整个测试满足性能阈值。
真实场景还要区分缓存命中、登录状态、读写比例与数据规模。不能让模型随意生成大量随机URL,就称为真实用户流量。负载应来自你有权测试的环境,避免影响他人服务。
图中阈值与结果是两个框。报告至少保留环境、脚本版本、持续时间、样本量、错误分类和响应分布,不能只截一张绿色终端图。
离线检查一份负载预算
下面验证教学计划的参数与预计请求上限,不运行k6或任何网络请求。
const assert = require('node:assert/strict'); function budget({ users, iterations, requestsPerIteration, ceiling }) { const values = [users, iterations, requestsPerIteration, ceiling]; if (values.some(x => !Number.isSafeInteger(x) || x < 1)) throw new TypeError('invalid load plan'); const requests = users * iterations * requestsPerIteration; if (!Number.isSafeInteger(requests)) throw new RangeError('overflow'); return { requests, withinBudget: requests <= ceiling }; } assert.deepEqual(budget({ users: 2, iterations: 5, requestsPerIteration: 3, ceiling: 30 }), { requests: 30, withinBudget: true }); assert.equal(budget({ users: 3, iterations: 5, requestsPerIteration: 3, ceiling: 30 }).withinBudget, false); assert.throws(() => budget({ users: 0, iterations: 5, requestsPerIteration: 3, ceiling: 30 })); console.log('load-budget: 3 assertions passed');保存为load-budget.cjs,运行node load-budget.cjs。这是固定迭代模型的总请求算术,不能当作每秒吞吐,也不能推导到达率模型。这个边界尤其需要写进自动生成报告。
压测结束后先解释失败
错误来自限流、业务拒绝、连接问题还是断言不符,需要分别展示。小样本的高分位数也应谨慎解释。提高超时或降低目标,可能只改变报告颜色,不会改善系统。
这里未安装或运行k6,未验证真实负载、浏览器体验、第三方限流或生产容量。本地检查只帮助阻止一份明显超额的教学计划进入执行;真正容量结论必须等到受控环境的运行证据出现。