CPU 飙高系统反应慢怎么排查?

从四个方面来思考:

  1. CPU 是整个电脑的核心计算资源,对于一个应用进程来说,CPU 的最小执行单元是线程。

  2. 导致 CPU 飙高的原因有几个方面

        a. CPU 上下文切换过多,对于 CPU 来说,同一时刻下每个 CPU 核心只能运行一 个线程,如果有多个线程要执行,CPU 只能通过上下文切换的方式来执行不同的线程。上下文切换需要做两个事情
    
             i. 保存运行线程的执行状态
    
             ii. 让处于等待中的线程执行 
    

这两个过程需要 CPU 执行内核相关指令实现状态保存,如果较多的上下文切换会占据 大量 CPU 资源,从而使得 cpu 无法去执行用户进程中的指令,导致响应速度下降。 在 Java 中,文件 IO、网络 IO、锁等待、线程阻塞等操作都会造成线程阻塞从而触发 上下文切换

        b. CPU 资源过度消耗,也就是在程序中创建了大量的线程,或者有线程一直占用 CPU                 资源无法被释放,比如死循环! 

           CPU 利用率过高之后,导致应用中的线程无法获得 CPU 的调度,从而影响程序的执行                 效率!
  1. 既然是这两个问题导致的 CPU 利用率较高,于是我们可以通过 top 命令,找到 CPU 利用率较高的进程,在通过 Shift+H 找到进程中 CPU 消耗过高的线程,这里有两 种情况。

         a. CPU 利用率过高的线程一直是同一个,说明程序中存在线程长期占用 CPU 没 有释放
    
            的情况,这种情况直接通过 jstack 获得线程的 Dump 日志,定位到线 程日志后就可
    
            以找到问题的代码。 
    
        b. CPU 利用率过高的线程 id 不断变化,说明线程创建过多,需要挑选几个线程 id,通
    
            过 jstack 去线程 dump 日志中排查。
    
  2. 最后有可能定位的结果是程序正常,只是在CPU 飙高的那一刻,用户访问量较大, 导致系统资源不够。

你可能感兴趣的:(java)