面试官:生产环境中 CPU 利用率飙高怎么办?
生产环境中 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 利用率飙高怎么办?相关推荐
- 假如生产环境出现CPU占用过高,如何分析思路和定位?
解决思路:先查占用CPU高的进程号---->然后查询占用CPU高的线程号---->z最后查询是具体哪行代码出的问题. 一. 使用top命令找出CPU占比最高的进程. 从图中可以查出CPU占 ...
- 假如生产环境出现CPU占用过高,如何排查与定位
1. 先用top命令找出CPU占比最高的,如下图最高的为java应用,pid为3989 2.用ps –ef或者jps进一步定位,得知是一个怎样的一个后台程序 ps -ef | gre ...
- CPU突然飙高系统反应慢,是怎么导致的?有什么办法排查?
[Java面试]场景面试题CPU突然飙高,系统反应慢怎么排查 面试过程中,场景类的问题更容易检测出一个开发人员的基本能力.这不,有一位小伙伴去阿里面试,第一面就遇到了关于"CPU 飙高系统反 ...
- Redis面试 - 生产环境中的 redis 是怎么部署的?
面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主从架构?集群架构 ...
- 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...
点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已经进行了两次扩容,内存增长还在持续中,希望业务方排查一下容量 ...
- 生产环境中on yarn模式是否采用yarn session
flink on yarn包括 yarn session以及per job两种方式. 那么生产环境中到底采用哪种呢? 下面是社区群中的讨论: 所以on yarn模式在生产环境中我们使用per job ...
- Dubbo Mesh 在闲鱼生产环境中的落地实践
本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是"借力开源. ...
- 云端设计平台Coohom在生产环境中使用istio的经验与实践
介绍 自从istio-1.0.0在今年发布了正式版以后,Coohom项目在生产环境中也开启了使用istio来作为服务网格. 本文将会介绍与分享在Coohom项目在使用istio中的一些实践与经验. C ...
- 记录一次生产环境中Redis内存增长异常排查全流程!
作者:z小赵 ★ 一枚用心坚持写原创的"无趣"程序猿,在自身受益的同时也让朋友们在技术上有所提升. 最近 DBA 反馈线上的一个 Redis 资源已经超过了预先设计时的容量,并且已 ...
- 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 参考文章: (1)使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 (2)https://www.cnblogs. ...
最新文章
- 微信公众号网页获取用户信息
- isnull pivot server sql_SQLServer行列转换 Pivot UnPivot
- java多对多关联数据操作,hibernate实施多对多关联查询时,关联表数据被删除
- 计算机视觉之OpenCV教程 --- Mat图像类基础(二)
- 本地数据库与mysql同步软件下载_SyncNavigator数据库同步软件
- HTML css嵌套的一个例子
- 用代码玩剧本杀?第3届83行代码大赛剧情官方解析
- 易语言 安装目录没有VC98linker 编译不成功 VC98linker静态连接器(迷你版),易语言VC98linker破解工具,修复静态编译。
- 统信系统安装京瓷打印机驱动步骤 针对京瓷系列复合机的UOS操作系统用户使用说明
- 同文输入法 android,同文输入法下载-同文输入法 v3.0-beta2_手机乐园
- Altium Designer20 PCB规则设置
- geopandas read_file报错RTreeError: Coordinates must be in the form (minx,
- Rust+官方APP使用教程
- es6---Promise
- 我参加第七届NVIDIA Sky Hackathon——训练CV模型
- 豆瓣读书top250数据爬取与可视化
- ETL工程师 2021-11-14
- Beyond Compare 4秘钥
- 三人同行七十稀 - 中国剩余定理浅析
- oracle系统中poord是什么,______A.tiredB.weakC.poorD.slow
热门文章
- 民数记研读1——于宏洁
- 2022虎符线上团队赛 有关web的部分题解(持续更新)
- uclinux和linux的使用区别,基于uClinux和Linux的对比分析
- MuMu模拟器忘记锁屏密码
- php斗鱼弹幕接口,php实现斗鱼弹幕,一起来欣赏弹幕吧~,斗鱼怎么看自己发过的弹幕...
- Pop猫 回收站图标
- Cups打印机驱动延迟Bug解决
- linux 查看vcf文件,转载-VCF格式详解
- C++ MFC 大湿兄作品!游戏自动跳跳防AFK 支持 自动按空格 取消 隐藏以及显示游戏。方便在公司玩。支持最小化到托盘 魔兽世界防AFK掉线
- 关于Snoop的用法