其实早就想对于性能问题的定位做一个总结。正好,最近做了一些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瓶颈
开发模式配置检查
参数检查
jinfo
线程堆栈:
jstack
kill -3/CTRL+BREAK
堆分析:
jmap -heap
jmap -histo
内存dump.bin,使用HeapAnalyser分析
GC:
gc.log,使用GCViewer或者JMeter分析
jstat
CPU:
sar
top
网络:
netstat
ifconfig
I/O:
vmstat
iostat
JVM综合分析:
JConsole
JProfiler
JOptimizer/Optimizeit
JVMStat
JVisualVM
转自:http://blog.csdn.net/raychase/article/details/6560150
http://blog.csdn.net/raychase/article/details/6595405