运维——CPU飙升到100%的原因

什么是 cpu 使用率?

CPU%= 1 - idleTime / sysTime * 100
idleTime:CPU 空闲的时间
sysTime:CPU 处于用户模式和内核模式的时间总和

与 cpu 有关的是什么?

计算密集型程序的 CPU 密集程度更高
那么,JAVA 应用程序中的哪些操作更加 CPU 密集?
以下列出了常见的 CPU 密集型操作:

  1. 频繁的 GC; 如果访问量很高,可能会导致频繁的 GC 甚至 FGC。当调用量很大时,内存分配将如此之快以至于 GC 线程将连续执行,这将导致 CPU 飙升。
  2. 序列化和反序列化。稍后将给出一个示例:当程序执行 xml 解析时,调用量会增加,从而导致 CPU 变满。
  3. 序列化和反序列化;
  4. 正则表达式。我遇到了正则表达式使 CPU 充满的情况; 原因可能是 Java 正则表达式使用的引擎实现是 NFA 自动机,它将在字符匹配期间执行回溯。
  5. 线程上下文切换; 有许多已启动的线程,这些线程的状态在 Blocked(锁定等待,IO 等待等)和 Running 之间发生变化。当锁争用激烈时,这种情况很容易发生。
  6. 有些线程正在执行非阻塞操作,例如 while(true)语句。如果在程序中计算需要很长时间,则可以使线程休眠。

cpu 是否与进程和线程有关?

线程的等待及阻塞不会使用 CPU 资源,线程的频繁的上下文切换(锁竞争激烈)容易造成 CPU 飙升。

一问一答

  1. while 的无限循环会导致 CPU 使用率飙升吗?
    会。
    首先,无限循环将调用 CPU 寄存器进行计数,此操作将占用 CPU 资源。那么,如果线程始终处于无限循环状态,CPU 是否会切换线程?
    除非操作系统时间片到期,否则无限循环不会放弃占用的 CPU 资源,并且无限循环将继续向系统请求时间片,直到系统没有空闲时间来执行任何其他操作。
    stackoverflow 中也提出了这个问题:为什么无意的无限循环增加了 CPU 的使用?

  2. 频繁的 Young GC 会导致 CPU 占用率飙升吗?
    会。
    Young GC 本身就是 JVM 用于垃圾收集的操作,它需要计算内存和调用寄存器。因此,频繁的 Young GC 必须占用 CPU 资源。
    让我们来看一个现实世界的案例。for 循环从数据库中查询数据集合,然后再次封装新的数据集合。如果内存不足以存储,JVM 将回收不再使用的数据。因此,如果所需的存储空间很大,您可能会收到 CPU 使用率警报。

  3. 对于 CPU 占用率高的应用程序,线程数是否较大?
    不是。
    高 CPU 使用率的关键因素是计算密集型操作。如果一个线程中有大量计算,则 CPU 使用率也可能很高。这也是数据脚本任务需要在大规模集群上运行的原因。

  4. 如果分时操作系统中 CPU 的值 us 或 sy 值很高,这意味着什么?
    您可以使用命令查找 CPU 的值 us 和 sy 值 top
    us:用户空间占用 CPU 的百分比。简单来说,高我们是由程序引起的。通过分析线程堆栈很容易找到有问题的线程。整编:微信公众号,搜云库技术团队,ID:souyunku
    sy:内核空间占用 CPU 的百分比。当 sy 为高时,如果它是由程序引起的,那么它基本上是由于线程上下文切换。

如何找出 CPU 使用率高的原因

如果发现应用程序服务器的 CPU 使用率很高,请首先检查线程数,JVM,系统负载等参数,然后使用这些参数来证明问题的原因。其次,使用 jstack 打印堆栈信息并使用工具分析线程使用情况

参考文档

这六种原因,真能让 Java 应用 CPU 使用率飙升至 100% 吗?

文章目录
  1. 1. 什么是 cpu 使用率?
  2. 2. 与 cpu 有关的是什么?
  3. 3. cpu 是否与进程和线程有关?
  4. 4. 一问一答
  5. 5. 如何找出 CPU 使用率高的原因
  6. 6. 参考文档
|