其实早就想对于性能问题的定位做一个总结。正好,最近做了一些Java的WEB应用性能问题的定位的专题工作,这里简单记录一些典型的性能问题定位方法。
(比如TPS偏低、吞吐量不足等:这些指标问题由下面说的多个指标造成,故不在单独讨论的范围之内)
应用CPU占用偏高,可能的因素包括:
逻辑复杂、算法效率低下
过度逻辑
检查方法:
JProfiler检查热点,等到系统稳定以后采集数据
截取堆栈,检查runnable线程,尤其对定位吞吐量不足造成的CPU占用偏高问题有帮助
堆栈占满,可能的因素包括:
堆配置过小
缓存配置过大
内存泄露
不及时的GC
检查方法:
jmap -heap 获取堆的详细信息
jmap -histo 获取不同对象的数量
多次jmap -heap 或 jhat 比较两个状态之间的对象变化情况
GC日志,使用工具辅助分析
DB瓶颈,可能的因素包括:
大表查询
不合理的索引
大表关联
待补充
检查方法:
分析SQL的执行计划,比如有的SQL可以走索引的结果走了全表扫描;哪些SQL cost偏高,需要优化
待补充。
磁盘I/O瓶颈,可能的因素包括:
略
检查方法:
vmstat
iostat
网络瓶颈,可能的因素包括:
略
检查方法:
查看Tomcat线程堆栈的时候会发现Tomcat线程池中的N多线程处于数据读取状态
ifconfig
其他问题:
LoadRunner瓶颈
开发模式配置检查