Cpu高或者i/o高都可以dump线程栈分析问题,一般可能要连续dump几次,dump出来后要关注状态。
第二:cpu高
第一先看是sys还是ur高
如果是sys的cpu高:
第一如果是I/o造成的:
如果nmon的diskbusy比较高,超过30%。说明sys的cpu高是I/o引起的,则需要去看cpu在读什么(大量的读说明内存不够了,此时要从磁盘中读),写什么(看请求在写东西,如果是线上的则需要看线上的日志)造成的cpu高(用sar命令看磁盘的队列,如果比较长,说明cpu高是磁盘导致)
如果不是I/o造成的,则用strack命令看内核调用情况。
第二是ur的cpu高
则需要应用程序本身,是什么造成的cpu高
- 首先:要找到cpu使用过高的进程(用top命令【按P按cpu的大小排序,按M按照内存排序)】(使用top命令,如果是多核cpu的话,就看cpus就可以了,多核cpu,使用率超过100很正常,是各个cpu的和)
- 第二步:找到cpu高的进程下的具体消耗cpu高的线程(使用命令top –H p pid)【同理还是按P进行cpu排序,则能找到消耗cpu最高的线程】
- 将找到的线程id转换成十六进制,具体的命令
printf “%x\n” tid (tid是线程的id)
- 最后使用jstack命令,具体命令
Jstack pid |grep 十六进制的tid
注释:pid是第二步中的pid,十六进制的tid是第三步中的
到此则可以定位到ur的cpu过高的原因
Ps:
通过该命令也可以定位消耗cpu高的
ps -mp pid -o THERAD,tid,time
定位cpu高的原因:
第一种:上面这种方法
第二种:jprofiler中的cpu的热点视图
第三种:jvisualVM中的cpu抽样