前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:生产环境中 CPU 利用率飙高怎么办?

面试官:生产环境中 CPU 利用率飙高怎么办?

作者头像
刘水镜
发布2022-07-29 13:26:07
6730
发布2022-07-29 13:26:07
举报
文章被收录于专栏:做个开发者做个开发者

生产环境中 CPU 利用率飙高的情况该如何排查?你是否在面试的时候也被问到过类似的问题呢?今天,我们就一起研究一下。

问题排查

让 CPU 燥起来

首先,我们需要让 CPU 燥起来。写一个死循环来疯狂占用 CPU 资源:

代码语言:javascript
复制
 public class CPU {
     public static void main(String[] args) {
 
         Thread thread = new Thread(() -> {
             while (true) {
                 System.out.println("cpu");
            }
        }, "cpu test");
 
         thread.start();
 
    }
 }

查看 CPU 运行情况

然后,运行上面这个小程序,再通过 top 命令来查看一下系统资源的使用情况:

图中灰色背景的 %CPU 字段就是我们需要关注的指标,它表示每个进程对于 CPU(单个核)占用的时间百分比。可以看到,我们的程序对 CPU 的占用率为 75.1%。

定位作妖的线程

接下来我们再进一步查看具体是哪个线程占用了过多的 CPU 资源。执行如下命令:

代码语言:javascript
复制
 top -Hp 1683

H 代表查看线程视图,p 用来指定具体的进程 ID,上面的命令就是用来查看进程1683 中所有线程的执行情况。

可以看到,占用 CPU 最多的线程就是那个 while (true) 线程——cpu test。

找出问题所在

找到了作妖的线程以后,就好办了,接下来通过 jstack 命令就可以看到该线程的运行栈信息了。不过在此之前,需要先做一个进制转换:

代码语言:javascript
复制
 printf "%x\n" 17706
 452a

将十进制的线程 ID(17706)转换成十六进制(452a)

有了十六进制的线程 ID 以后,就可以通过 jstack 命令来精确定位导致 CPU 飙高的代码了。

代码语言:javascript
复制
 jstack 17683 | grep -A 20 452a

OK,我们找到了导致 CPU 飙高的「罪魁祸首」,在 CPU.class 的第 8 行:

以上就是开头那个问题的标准答案了。中小型公司可能会这样来处理,但是,大型公司基本上不会这样搞。第一,不会让你随便登录生产服务器;第二,服务器太多,这种方式根本管不过来。所以,一般都会有成体系的监控平台。

TOP 命令相关指标

top 命令除了查看 CPU 的使用情况外,还有很多很有用的信息。下面对这些指标做一个简要说明,供参考。

概要信息

字段

含义

top-21:41:19

当前时间

up 4:04

系统运行时长(4 小时 4 分钟)

1 user

当前登录用户个数

load average: 2.75, 1.72, 1.08

系统平均负载,1 分钟、5 分钟、15 分钟

当然任务(进程/线程)情况

字段

含义

total

总进程/线程数

running

正在运行的进程/线程数

sleeping

睡眠的进程/线程数

stopped

停止的进程/线程数

zombie

僵尸进程/线程数

CPU 资源使用情况

字段

含义

us

user CPU time:用户空间占用 CPU 的百分比

sy

system CPU time:系统内核空间占用 CPU 的百分比

ni

nice CPU time:用户空间进程改变过优先级的 CPU 百分比

id

idle:空闲时间百分比

wa

iowait:等待 IO 的时间百分比

hi

hardware Interrupt request:硬件中断请求的时间百分比

si

software Interrupt request:软件中断请求的时间百分比

st

steal time:被虚拟机偷走的时间百分比

内存情况

物理内存

字段

含义

total

物理内存总量

free

空闲内存总量

used

使用的物理内存总量

buff/cache

用作内核缓存的内存量

swap

字段

含义

total

交换区总容量

free

空闲交换区总量

used

使用交换区的总量

avail Mem

内存可用量(不会使用 swap)

进程/线程详情

字段

含义

PID

进程/线程 ID

USER

进程/线程所有者

PR

进程/线程优先级

NI

nice值。负值表示高优先级,正值表示低优先级

VIRT

进程/线程(申请)使用的虚拟内存,单位 KB,VIRT=SWAP+RES

RES

进程/线程(实际)使用的物理内存

SHR

进程/线程使用的共享内存

S

进程/线程状态,D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU

上次更新到现在的 CPU 时间百分比(单核)

%MEM

上次更新到现在的内存百分比

TIME+

进程/线程占用 CPU 的总时间,精确到百分之一秒

COMMAND

进程/线程名(或命令)

- 完 -

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 做个开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题排查
    • 让 CPU 燥起来
      • 查看 CPU 运行情况
        • 定位作妖的线程
          • 找出问题所在
          • TOP 命令相关指标
            • 概要信息
              • 当然任务(进程/线程)情况
                • CPU 资源使用情况
                  • 内存情况
                    • 物理内存
                    • swap
                  • 进程/线程详情
                  相关产品与服务
                  云开发 CloudBase
                  云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档