为什么CPU负载高?

本文介绍使用SAE时,如何解决CPU负载高的问题。

问题现象

  • CPU使用率100%
  • CPU使用率高
  • 负载(Load)高

问题原因

CPU使用率高或者负载高的原因与程序运行状态有关,包括启动时与运行时。

解决方案

场景一:启动时CPU使用率高/负载高

部分语言(例如Java)在刚启动时,存在二次编译的过程。Java会随着程序的运行把字节码编译为机器码,这时候叠加正常的流量处理,就会表现为启动时CPU使用率高/负载高,但启动阶段结束后便会下降。请确认您所使用的语言是否有该特性,如果是该原因,则是正常现象,建议您多预留一部分缓冲(Buffer)。

场景二:运行时CPU使用率/负载高

  1. 根据SAE基础监控确认各个指标情况,是否有相关性。例如CPU使用率高的同时,查看到TCP连接数也大增,就可以结合程序特点,推导背后的根因。
    可以考虑将应用级别的监控切换为实例级别的监控,确认CPU使用率高/负载高出现在所有实例还是个别实例。如果只有个别实例CPU使用率高/负载高,考虑是否可能有该机器运行的定时任务,或者某些特定业务请求触发了大批量操作。sc_choose_instance_on_basic_monitoring_page
  2. 可选:如果您的应用是Java语言,您还可以按如下步骤排查。
    1. 执行top命令,查看进程的系统资源占用信息,通常可以看到Java进程占用CPU较高。
    2. 执行top -H命令,查看线程的资源占用,找到CPU较高的线程ID。根据线程ID,执行[printf "%x\n" 线程_id]转换为十六进制。

      部分ALPINE镜像可能不支持top -H命令,您需要先安装Htop命令。具体操作,请参见如何安装常见命令?

    3. 参见Java通过Jstack查看线程栈获得Java的线程栈,通过和上面十六进制的线程ID匹配,找到CPU占用较高的线程栈,分析根因。sc_run_command_printfsc_view_matched_cpu