性能测试-性能测试中的经典面试题二
一、实战场景与问题排查
经典性能瓶颈定位
CPU飙高:
@bash
top→top -H -p [PID] → printf "%x" [线程ID] → jstack [PID] | grep [十六进制ID]
定位到代码方法。
内存泄漏:
jmap -heap
观察老年代占用 →jvisualvm
分析堆转储 → 定位未释放对象。TPS上不去:
检查压力机负载 → 网络带宽 → 中间件连接池 → 外部依赖超时。
线上问题应急案例
MQ消息积压:扩容Consumer → 日志快照 → 复盘根因(如消费逻辑阻塞)。
数据库CPU高:慢SQL分析(
EXPLAIN
执行计划)→ 索引优化/查询拆分。
四、架构与高阶实践
全链路压测核心要点
影子库/数据隔离:避免污染生产数据
流量染色:标识测试请求,隔离日志监控
渐进式施压:从10%流量逐步提升。
性能优化策略
JVM层:调整新生代比例(-XX:NewRatio)、避免FGC(-XX:+UseG1GC)
中间件:Tomcat线程池优化(maxThreads ≈ 单核TPS × 响应时间)
缓存策略:Redis抗读并发,DB抗写。
团队级性能体系建设
左移测试:需求阶段定义性能指标。
自动化流水线:CI集成基准测试。
线上监控:建立实时告警(如TPS下跌30%)。
Q:描述一次性能调优成功案例?
A:
在电商大促项目中,压测发现订单提交接口TP50达5秒。
定位:Arthas追踪显示85%耗时在库存查询SQL → 执行计划发现全表扫描。
优化:添加复合索引(product_id + warehouse_id
)→ 引入Redis缓存热点库存。
结果:TP50降至200ms,TPS从120提升至600。
Q:如何评估线下环境压测数据的线上可信度?
A:
配置对齐:CPU/内存/磁盘类型同比例缩放
损耗补偿:网络延迟增加20%~30%冗余
影子流量:复制生产流量模型回放
容量公式:线下单机TPS × 节点数 × 0.7(集群损耗系数)。