已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
K8s 1.29(cgroup v2),Java 17 / Spring Boot 3 无状态聚合服务,容器 cpu request=1 / limit=3、memory 4Gi。入口 QPS 稳态 800,峰值 ~1500。单请求链路:Tomcat 工作线程 → 并行调 3 个下游(RPC + MySQL + Redis,各自 RT 20~120ms,P99 合计 ~300ms)→ 聚合返回。下游连接池:HikariCP max=20,Redis 池 max=30。
当前 Tomcat threads.max=200(历史遗留,按「CPU 核数 × 100」拍的)。压测发现:
cfs_throttled_periods_total 增长缓慢——看起来不是 CFS 节流,而是线程排队;threads.max 从 200 砍到 60 后 P99 反而降到 480ms,再砍到 30 开始劣化(HikariCP 出现 connectionTimeout);并发线程 ≈ 峰值QPS × 单请求平均耗时 = 1500 × 0.3s ≈ 450,结论是「200 还不够」;线程池 ≤ DB池 × 2 ~ 3(因为每个请求最多占 1 个 DB 连接 30~120ms),结论是「线程池应 ≤ 60,200 纯属浪费」;kubectl top pod / cAdvisor:CPU 利用率峰值 65%、throttle 率 <5%,排除 CFS 主因(参考站内 id=1631 的 runqueue 排查思路,节点侧 runq 也正常);queueSize 峰值 300+,threadBlocked 主要卡在 HikariPool.getConnection——确认瓶颈在 DB 连接等待;connectionTimeout 归零、上下文切换次数从 ~8k/s 降到 ~2k/s,P99 改善;