Linux 中CPU占用过高问题

Linux 中CPU占用过高问题

在我们日常开发中常常会有一些CPU资源占用过高的问题,这些问题往往会导致我们系统运行的缓慢,甚至造成系统的奔溃,那我们如何进行这种问题的定位呢,本文将带你研究。

  1. 第一步查看系统进程,CPU资源占用情况

    使用topps -aux --sort=-pcpu|head -10 命令查看一下进程和CPU

    • top
    • ps -aux --sort=-pcpu|head -10
  2. 定位问题线程

    上一步我们可以或得系统CPU资源占用高的进程号pid

    top -H p pid可以查看某个进程的线程信息:-H 显示线程信息,-p指定pid

    发现CPU和内存都偏高的线程id(tid)

  3. 分析线程CPU占用过高的问题原因

  4. 输出线程ID的16进制 nid=0x+16进制线程id.

    printf ‘%x\n’ 11222 #输出线程 ID 的 16 进制

  5. 定位线程出现问题的原因

    jstack pid | grep ‘0x900’ -C 30 --color 打印某个 Java 线程的线程栈信息查看问题

  6. 如果线程数目过多,可能问题原因是线程的上下文切换导致的

    • 通过vmstat命令来查看一下操作系统层面的线程上下文切换活动

      cs那一栏表示线程上下文切换次数,in表示CPU中断次数,我们发现这两个数字非常高,基本证实了我们的猜测,线程上下文切切换消耗了大量CPU。

    • pidstat 监控进程信息:

      pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
      
  7. 查看磁盘 df -h

  8. 查看内存 free -m

总结: 遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。\

你可能感兴趣的:(后端,linux,java)