延迟、吞吐、分位数与排队:性能指标怎样互相约束
平均值解释过去,分布和到达过程决定风险。
Micrometer 的 直方图与分位数 解释可聚合直方图和客户端分位数边界。
故障现场:局部数字为什么会给出错误结论
平均延迟仍是 38 ms,少量请求却达到 180 ms;闭环压测器等待慢响应后才发下一次请求,系统越慢,施加的负载反而越低。 第一条规则是同时保存负载输入、业务输出和资源水位;只有结果数字而没有发生条件,无法区分代码变化、环境噪声、缓存热度和依赖波动。
先固定权威测量对象
端到端响应时间从计划到达时刻计起,拆成客户端排队、网络、服务端队列、执行和返回;服务时间不能代替响应时间。 正向实验达到预期吞吐和延迟,反向实验制造饱和、队列、暂停或依赖退化,并证明指标能揭示而非掩盖差异。
六段性能主链
Arrival process
在 Arrival process 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Queue wait
在 Queue wait 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Service time
在 Service time 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Latency histogram
在 Latency histogram 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Throughput
在 Throughput 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
SLO verdict
在 SLO verdict 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
性能结论先声明系统边界与负载模型
分布、排队和守恒关系必须同时成立
负载发生器也会制造测量错误
资源池必须沿同一截止时间协作
虚拟线程降低线程持有成本,不增加数据库连接、CPU 或远端 QPS;连接池扩大会增加数据库活跃会话和锁竞争;批量与压缩减少网络调用却增加内存、延迟和 codec CPU。任何参数变化都观察瓶颈是否迁移,不能只看被优化局部的耗时。
JVM、GC 与操作系统证据不能脱离业务负载
CPU 利用率低不代表有余量,线程可能等锁、连接、磁盘或网络;CPU 高也可能是序列化、压缩、GC、TLS 或自旋而非业务计算。结合运行队列、上下文切换、缺页、磁盘时延、网络重传和容器 throttling,先定位资源需求再调整参数。
性能数据同样需要安全与治理
用阶梯负载画出拐点而不是只压一个峰值
分层剖析必须回答时间和资源去了哪里
时间分解要能闭合:入口总时间与排队、执行、下游和提交关键路径之差在容许误差内;资源分解用 CPU 时间、分配字节、网络字节、SQL 行数和消息数解释每个成功工作单元。若总时间闭合而吞吐仍异常,检查并发度和串行临界区;若资源/请求下降但总资源上升,检查提速后流量放大和瓶颈迁移。
基准结果需要反事实与可回滚证据
每项优化先写机制假设,例如“减少一次复制将降低每请求分配 8 KB,并在相同吞吐下降低 GC CPU”;然后选择能证伪它的指标。候选版本若延迟改善但分配不变,结论可能来自环境噪声或别的路径。恢复旧实现、切换 feature flag 或运行 A/B 对照,应重新出现基线差异;只有单向跑一次的绿色数字不能证明因果。
门禁对不同指标设方向和容忍区间:吞吐不得下降超过阈值,p99 不得越过 SLO,错误必须不增,CPU/请求和内存/请求不能以不可解释方式恶化。统计显著但业务影响极小不必阻断,业务越界即使样本方差较大也必须继续采样或保守阻断。报告保留全部重复结果而非只挑最好一轮,并保留失败轮次、异常退出和发生器饱和,不能只统计成功完成的样本。
每个回归门禁绑定业务 SLO 和风险:吞吐、p99、错误率、资源/请求、积压恢复时间至少选择相互制约的组合。允许波动区间来自重复基线而非拍脑袋;发生退化时保留原始结果、环境指纹和剖析证据。优化上线采用小流量、对照组和自动回滚,确认尾延迟、错误、资源和权威业务状态均未退化。
两个 Java 17 模型固定量化见证
离线模型不冒充真实压测,只固定公式、边界和判定输出;真实环境再用直方图、JFR/GC 日志、数据库与消息指标证明同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/performance/latency-throughput-queueing/LatencyDistributionDemo.java examples/backend-development/performance/latency-throughput-queueing/CoordinatedOmissionDemo.java
java -cp examples/backend-development/performance/latency-throughput-queueing LatencyDistributionDemo
java -cp examples/backend-development/performance/latency-throughput-queueing CoordinatedOmissionDemosamples=10 p50=12 p95=180 p99=180 max=180 mean=38.2 tailVisible=true
intervalMs=10 pauseMs=100 observed=2 corrected=11 observedP99=100 correctedP99=100 omitted=9容量、回归与恢复门禁
同时报告到达率、完成率、并发、队列长度、p50/p95/p99/max 和错误;任何分位数都带窗口、样本量、桶边界和缺失策略。 围绕“延迟分布必须在明确到达模型和吞吐下解释,排队等待与服务时间分别计量”保存基线、候选、差值、原始分布和权威结果。过载实验还要证明拒绝有界、关键流量受保护、积压排空且恢复迟滞不会制造二次冲击;不满足任一项即阻止发布或自动回滚。
