CPU飙高原因及解决方案

一、CPU飙高原因:

     1.大量中断

            中断分为软中断(软中断是一种需要内核为正在运行的进行去做一些事情的请求)和硬中断(外部引起的)

      2.系统负载高

             负载高表示有很多程序等待调度运行,它会导致上下文切换频繁

      3.上下文切换频繁

二、排查 

       1.top命令查看占用CPU的pid

       2.top -H -p pid  查找pid下面的线程id,显示线程的cpu的占用时间,占用比例,发现有很多个线程都会CPU占用很高,只能每              个排查

       3.jstack查看线程信息,命令: jstack pid >> aaaa.txt 输出到文本中再搜索,也可以直接管道搜索 jstack pid | grep "线程id" 这个线程id是16进制表示,需要转一下,可以用这个命令转 printf "%x\n" tid 也可以自己计算器转一下。

       

三、经常出现CPU飙高场景

      1.大量并发的I/O操作    

           一般 I/O 操作不会消耗太多的 CPU ,因为主要的时间消耗会在 I/O 操作的设备上。比如从磁盘读文件时,主要的时间在              磁 盘内部的操作上,而消耗的 CPU 时间只占 I/O 操作响应时间的一少部分。但在大量的并发的 I/O 时才可能会使得 SYS            CPU 有所增加

       2.多线程抢占系统资源

             对于多个线程抢占某一个系统调用的资源,会导致大量的线程等待->唤醒->抢占,未抢到->等待...。导致不断的切换线程                 耗 费cpu。

       3.频繁GC

四、解决

      不同情况引起的CPU飙高要需要不同的方式进行解决,需定位什么原因造成的。

             

你可能感兴趣的:(JAVA基础)