问题:CPU偏高是什么原因?怎么分析?
CPU偏高分为:System的CPU偏高和UseCPU偏高。
1.System:内核调用,IO导致的,看IO是否使用频繁,通过命令(sar或者nmon---disk busy )查看diskbusy,若diskbusy超过30%以上就可以称IO繁忙,通过命令(iostat)查看磁盘中IO的排序队列;如果不是IO繁忙,就通过命令starce,查看内核调用什么比较频繁。iostat看具体哪块磁盘使用繁忙,再看read或write哪个繁忙,询问开发人员为什么读写这么高,找出原因。
读高:大量读取数据造成内存不够引起的;
写高:需要减少写的频率。
2.use:说明应用程序本身比较繁忙,top命令查看哪个进程使用频率高,再用top -H -p(pid)命令找到找到最高cpu使用线程后,转化为16进制(printf "%x\n" 线程id),再使用Jstack 进程id | grep 线程id(转化为16进制后的线程id)
1、use cpu高
现象:压测过程中,使用top命令查看系统资源占用情况,us cpu过高,超过50%以上。
原因:UseCPU偏高说明应用程序本身比较繁忙
排查手段:
(1)使用top命令是哪个进程消耗CPU高
(2)再找到CPU消耗高的线程:top -H -p 进程号
(3)把线程号转换成16进制:printf "%x\n" 线程号
(4)再用jstack命令分析这个线程是在干什么:jstack 进程号 | grep 16进制的线程号
(5)通过JProfiler的CPU Views视图的层层分析,可以清楚的找到造成CPU高的原因
2、system cpu高
现象:压测过程中,使用top命令查看系统资源占用情况,sy cpu过高,超过50%以上。
原因:内核调用,IO导致的,看IO是否使用频繁
排查手段:
(1)首先查看磁盘繁忙程度、磁盘的队列(nmon、sar),查看diskbusy,若diskbusy超过30%以上就可以称作IO繁忙;
(2)IO繁忙的话,查看磁盘中IO的排序队列(iostat),看具体是read还是write繁忙,询问开发人员为什么读/写这么高,找出原因;
读高:大量读取数据造成内存不够引起;
写高:需要减少写的频率;
(3)如果IO不繁忙,也就是磁盘没有问题,则使用strace查看系统内核调用情况,具体内核调用什么比较频繁;