问题定位方法总结

2 篇文章 0 订阅

1 问题分类

1)资源使用过度或不合理:

内存(coredump,32位单板时代时不时出现)
CPU消耗殆尽(线程空转,纯代码bug)
句柄数耗光(资源释放不合理,或者并发过高)
线程/连接挂死(未设置超时,未限呼等)
带宽(带宽不足导致丢包率增加,响应超时等;高并发场景会出现)

2)外系统对接(包括数据库)

凡是需要同步访问某外系统(包括数据库)的场景,很有可能出现如下情况:
连接挂死
句柄数超限(因连接挂死导致句柄资源无法释放)
内存飙升(因连接挂死导致线程挂起,线程会占用临时内存和栈内存)

3)业务逻辑

2 定位手段

1)内存问题(64位系统场景,32位不考虑)

 一般考虑dump出来(jmap –dump:file=fname <pid>)后分析堆(使用MemoryAnalyzer+XManager);
  若情况紧急,条件不备,可多次采样:
          jmap <pid>  > snapshotX
          jstack –l <pid> > stackX
  然后对多次采样的快照snapshotX通过excel排序后对比(不排序对比可能很难看出差异)
  结合jstack 中处于Runnable状态的线程,一般也可以找到问题。

2)CPU问题

jstack –l  <pid> 导出堆栈; 
top –H  找到线程号,将线程号转化为16进制,在堆栈中找到该线程,看看线程在做什么;
注意:有一种特殊情况,在堆栈中找不到,这种一般是由JNI调用的第三方产生的线程。  


3)句柄数问题


lsof –p <pid>  查看句柄消耗在哪些方面(socket or file)
jstack 查看堆栈,看看是否有线程挂起
若没有挂起线程,则查看Runnable线程是否有句柄未释放问题

4)线程/连接挂死(外系统对接)


jstack –l  <pid> 导出堆栈; 
按照如下状态优先依次查看 blocked  waiting runnable状态的线程。
若有挂起,堆栈一般会明确反应当前掐在何处。

5)带宽问题


一般内存和CPU都没有问题的情况下,如果用户体验慢,那么一定是网络出问题了。而且往往是带宽不足。

6)心得

jstack jmap top lsof 这几个命令要熟练掌握
在不太清楚问题的定位思路时,先执行这几个命令,结合业务日志和命令的输出再看看
不要轻易怀疑是操作系统或JVM甚至硬件问题
 

3 紧急问题规避和处理

首先看看在流程层面能否解决,比如清空非关键表等着线程扫到,打开某个开关等;
一般的内存和CPU问题如果有调测页面或者能写出调测页面拿到实例,可以通过调测代码释放;

连接挂起的场景
一般ftp的passive方式的话,可以通过telnet到挂起的端口释放。
其他jdbc或者外系统连接看看能否通过网络命令断开。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值