线程池、连接池、IO、序列化与压缩:资源池如何形成瓶颈
池只限制并发,不会创造下游容量。
Java 虚拟机 GC 指南 将吞吐和延迟作为主要度量;池与编解码还需结合分配率和暂停证据。
故障现场:局部数字为什么会给出错误结论
HTTP worker 扩到 200,数据库连接仍是 20;大量线程只把等待从入口队列搬到连接池,并增加上下文切换、堆栈、超时和重试。 第一条规则是同时保存负载输入、业务输出和资源水位;只有结果数字而没有发生条件,无法区分代码变化、环境噪声、缓存热度和依赖波动。
先固定权威测量对象
分别观测入口队列、活跃 worker、连接获取等待、Socket 读写、编解码 CPU、分配字节和下游响应;吞吐由最窄资源决定。 正向实验达到预期吞吐和延迟,反向实验制造饱和、队列、暂停或依赖退化,并证明指标能揭示而非掩盖差异。
六段性能主链
Admission
在 Admission 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Worker pool
在 Worker pool 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Connection pool
在 Connection pool 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
IO wait
在 IO wait 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Codec CPU
在 Codec CPU 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
Backpressure
在 Backpressure 阶段记录时间戳、计数、资源 owner、上限和失败原因。测量探针的开销单独评估;并行阶段按关键路径组合,串行阶段才允许求和。改变参数后重新验证上下游水位,避免把等待从一个队列搬到另一个队列。
性能结论先声明系统边界与负载模型
分布、排队和守恒关系必须同时成立
负载发生器也会制造测量错误
资源池必须沿同一截止时间协作
虚拟线程降低线程持有成本,不增加数据库连接、CPU 或远端 QPS;连接池扩大会增加数据库活跃会话和锁竞争;批量与压缩减少网络调用却增加内存、延迟和 codec CPU。任何参数变化都观察瓶颈是否迁移,不能只看被优化局部的耗时。
JVM、GC 与操作系统证据不能脱离业务负载
CPU 利用率低不代表有余量,线程可能等锁、连接、磁盘或网络;CPU 高也可能是序列化、压缩、GC、TLS 或自旋而非业务计算。结合运行队列、上下文切换、缺页、磁盘时延、网络重传和容器 throttling,先定位资源需求再调整参数。
性能数据同样需要安全与治理
用阶梯负载画出拐点而不是只压一个峰值
分层剖析必须回答时间和资源去了哪里
基准结果需要反事实与可回滚证据
两个 Java 17 模型固定量化见证
离线模型不冒充真实压测,只固定公式、边界和判定输出;真实环境再用直方图、JFR/GC 日志、数据库与消息指标证明同一不变量。
javac --release 17 -Xlint:all -Werror examples/backend-development/performance/pools-io-serialization/PoolBottleneckDemo.java examples/backend-development/performance/pools-io-serialization/SerializationBudgetDemo.java
java -cp examples/backend-development/performance/pools-io-serialization PoolBottleneckDemo
java -cp examples/backend-development/performance/pools-io-serialization SerializationBudgetDemoworkers=32 dbConnections=12 activeRequests=40 executing=12 waitingForDb=20 queued=8 bottleneck=DB_POOL
payloadKB=256 rawCpuMs=4 compressedKB=64 codecCpuMs=11 networkSavedKB=192 totalMs=15 beneficial=true容量、回归与恢复门禁
超时预算沿入口排队、连接获取、执行、网络和重试递减;任一池队列有界,拒绝携带稳定原因并计数,不能在多个无界队列重复等待。 围绕“串联资源池拥有一致的超时与队列预算,最慢资源显式背压上游而不制造隐藏等待”保存基线、候选、差值、原始分布和权威结果。过载实验还要证明拒绝有界、关键流量受保护、积压排空且恢复迟滞不会制造二次冲击;不满足任一项即阻止发布或自动回滚。
