一般来说,一个已经投入运营的大型项目出现问题的可能最多如下几种情况:
1.异常的CPU使用
1)查看CPU使用率,与目标进程的使用情况,再查看每个内核的使用情况。可以辅助定位是单个线程问题或线程池问题。
2)有时,程序在正常一段时间后,突然CPU垂直升高,那么可能与程序内的锁有关(如果锁持有的时间很短,不如试试cas+yield来实现自旋锁)
3)死锁,直接导出调用栈,寻找问题解决。
2.异常的内存
1)内存泄漏,没什么好说的,dump出堆栈查找问题
2)频繁的GC也会导致性能不足,在程序经常出现GC的情况下,就要注意了,调高新生代大小如果仍然不能解决则需要定位大量创建临时对象的代码(可以使用对象池技术来避免内存重复申请的情况)
3.某个工作线程的意外终止
1)
4.异常的IO
1)查看打开文件,IO操作占用,磁盘使用率。可以使用命令 df iostat 等
2)查看是否有程序占用监听,网络使用率,可以使用命令 netstat 等
使用工具分析故障
1.jmap
jmap pid 默认查看JAVA进程中内存使用相关信息
jmap -histo pid 查看内存中活跃的实例数量
jmap -dump:format=b,file=(文件名) pid 完整导出java程序内存。完整分析分三个流程,在程序初始化完毕后执行一次 jmap -dump:format=b,file=a.bin 然后在内存占用开始出现上涨的时候执行一次,最后等达到上限后再执行一次,用JHat或者第三方工具来打开dump文件。
3.jstack或者JCONSOLE
默认 可以查看进程调用栈信息,用来分析IO超时,死锁,或者其他情况。程序出现异常必须要分析的信息,可以辅助问题的定位和排除。
jstat -gc pid gaptime 查看GC相关信息
jstat -compiler pid 查看实时编译信息
4.kill -3
同上,适用于没有安装develop工具的服务器,可以输出调用栈信息和部分GC信息
5.iftop 查看网口
查看网络出入流量与目标服务器之间的流量,可以辅助排查是否由攻击引起的
10 pstack 虚拟机堆栈
需要安装gdb,一般用于检查c/c++程序,在某些虚拟机级错误的时候。
来源: http://www.92to.com/bangong/2016/12-03/13846219.html