【每日一题】功能压测都达标,跑 8 小时却越来越慢(附参考答案)

题目:某 Java 服务做性能测试:按预期峰值压测,TPS、成功率、RT 全部达标。随后按峰值 80% 做 8 小时长稳测试,发现 TPS 从 1200 缓慢降到 900,RT P99 从 80ms 涨到 900ms,同时监控到 JVM 老年代水位一波比一波高、Full GC 间隔越来越短、TCP 连接数与文件句柄稳步上涨。最可能的原因是()

A. 施压机网络带宽被打满,压测端瓶颈
B. 系统容量本身不够,目标 QPS 定高了
C. 存在内存泄漏 / 连接或句柄未释放,GC 压力持续放大,形成恶性循环
D. 数据库存在慢 SQL,压测开始就把 CPU 打满了

难度:中级
题型:笔试(单选)

:point_right:参考答案/答题要点:

答案:C

  • 判据是趋势型衰减 + 资源单调上涨:泄漏型问题的典型特征是"刚起跑一切正常,越跑越差",且伴随堆、句柄、连接数的持续累积。
  • A 会被排除:施压机带宽不足通常在加压那一刻就限住 TPS,不会前高后低,也不会让被测端 JVM 指标恶化。
  • B 会被排除:负载压测阶段已达标,且容量不足表现为高水位下 RT 突然拐点,而不是 8 小时缓慢滑坡。
  • D 会被排除:慢 SQL 类瓶颈在压测初期就会显性出现(CPU/IO 打满、TPS 上不去),而非趋势性。
  • 采分点:长稳(Soak)测试的目的就是说"资源是否可长期持有";观测项要能列全(RSS、老年代、GC 频次与耗时、线程数、句柄数、连接池 active/idle、磁盘与日志增速、缓存命中率);定位手段(GC 日志、jmap 两份堆 dump 用 MAT 对比支配树、Arthas、火焰图、ss/lsof 看连接堆积);结论口径(连续 N 小时内资源增长曲线收敛、TPS 衰减 < 5% 才算过)。
  • 延伸:连接池未归还(异常分支漏 close)、大对象/ThreadLocal 未清理、定时任务叠加、日志与临时文件把盘写满,都属于同一类线上事故前兆。