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

问题排查

让 CPU 燥起来

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

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 资源。执行如下命令:

top -Hp 1683

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

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

找出问题所在

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

printf "%x\n" 17706
452a

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

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

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 进程/线程名(或命令)

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

  1. 假如生产环境出现CPU占用过高,如何分析思路和定位?

    解决思路:先查占用CPU高的进程号---->然后查询占用CPU高的线程号---->z最后查询是具体哪行代码出的问题. 一. 使用top命令找出CPU占比最高的进程. 从图中可以查出CPU占 ...

  2. 假如生产环境出现CPU占用过高,如何排查与定位

    1. 先用top命令找出CPU占比最高的,如下图最高的为java应用,pid为3989          2.用ps –ef或者jps进一步定位,得知是一个怎样的一个后台程序 ps -ef | gre ...

  3. CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?

    [Java面试]场景面试题CPU突然飙高,系统反应慢怎么排查 面试过程中,场景类的问题更容易检测出一个开发人员的基本能力.这不,有一位小伙伴去阿里面试,第一面就遇到了关于"CPU 飙高系统反 ...

  4. Redis面试 - 生产环境中的 redis 是怎么部署的?

    面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主从架构?集群架构 ...

  5. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...

    点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...

  6. 生产环境中on yarn模式是否采用yarn session

    flink on yarn包括 yarn session以及per job两种方式. 那么生产环境中到底采用哪种呢? 下面是社区群中的讨论: 所以on yarn模式在生产环境中我们使用per job ...

  7. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源. ...

  8. 云端设计平台Coohom在生产环境中使用istio的经验与实践

    介绍 自从istio-1.0.0在今年发布了正式版以后,Coohom项目在生产环境中也开启了使用istio来作为服务网格. 本文将会介绍与分享在Coohom项目在使用istio中的一些实践与经验. C ...

  9. 记录一次生产环境中Redis内存增长异常排查全流程!

    作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已 ...

  10. 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题

    使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 参考文章: (1)使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 (2)https://www.cnblogs. ...

最新文章

  1. 微信公众号网页获取用户信息
  2. isnull pivot server sql_SQLServer行列转换 Pivot UnPivot
  3. java多对多关联数据操作,hibernate实施多对多关联查询时,关联表数据被删除
  4. 计算机视觉之OpenCV教程 --- Mat图像类基础(二)
  5. 本地数据库与mysql同步软件下载_SyncNavigator数据库同步软件
  6. HTML css嵌套的一个例子
  7. 用代码玩剧本杀?第3届83行代码大赛剧情官方解析
  8. 易语言 安装目录没有VC98linker 编译不成功 VC98linker静态连接器(迷你版),易语言VC98linker破解工具,修复静态编译。
  9. 统信系统安装京瓷打印机驱动步骤 针对京瓷系列复合机的UOS操作系统用户使用说明
  10. 同文输入法 android,同文输入法下载-同文输入法 v3.0-beta2_手机乐园
  11. Altium Designer20 PCB规则设置
  12. geopandas read_file报错RTreeError: Coordinates must be in the form (minx,
  13. Rust+官方APP使用教程
  14. es6---Promise
  15. 我参加第七届NVIDIA Sky Hackathon——训练CV模型
  16. 豆瓣读书top250数据爬取与可视化
  17. ETL工程师 2021-11-14
  18. Beyond Compare 4秘钥
  19. 三人同行七十稀 - 中国剩余定理浅析
  20. oracle系统中poord是什么,______A.tiredB.weakC.poorD.slow

热门文章

  1. 民数记研读1——于宏洁
  2. 2022虎符线上团队赛 有关web的部分题解(持续更新)
  3. uclinux和linux的使用区别,基于uClinux和Linux的对比分析
  4. MuMu模拟器忘记锁屏密码
  5. php斗鱼弹幕接口,php实现斗鱼弹幕,一起来欣赏弹幕吧~,斗鱼怎么看自己发过的弹幕...
  6. Pop猫 回收站图标
  7. Cups打印机驱动延迟Bug解决
  8. linux 查看vcf文件,转载-VCF格式详解
  9. C++ MFC 大湿兄作品!游戏自动跳跳防AFK 支持 自动按空格 取消 隐藏以及显示游戏。方便在公司玩。支持最小化到托盘 魔兽世界防AFK掉线
  10. 关于Snoop的用法