当前位置:网站首页>面试官:生产环境中 CPU 利用率飙高怎么办?
面试官:生产环境中 CPU 利用率飙高怎么办?
2022-07-29 13:59:00 【刘水镜】
生产环境中 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,上面的命令就是用来查看进程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 | 进程/线程名(或命令) |
- 完 -
边栏推荐
猜你喜欢
Redis-NoSql
暴力递归到动态规划 02 (绝顶聪明的人的纸牌游戏)
EA&UML日拱一卒-活动图::StartClassifierBehavior和StartObjectBehavior
第4章_1——SQL语句实现MySQL增删改查
抓住这几个关键点,做薪酬数据分析并不难
kubernetes中正strace etcd
R Error in :missing values are not allowed in subscripted assignments of data frames
EA&UML日拱一卒-活动图::Variable Actions(续)
第4章_2——视图的使用
The new technical director, who is in the form of a isXxx Boolean type definition, tomorrow need not come!
随机推荐
【JS面试题】面试官问我:遍历一个数组用 for 和 forEach 哪个更快?
蚂蚁三面滑铁卢!遭分布式截胡,靠这些笔记潜修30天,挺进京东
480-82(59、151)
何为擦除机制,泛型的上界?
AI全流程开发难题破解之钥
第4章_1——SQL语句实现MySQL增删改查
苹果官方降价的原因找到了,它也面临销量下滑乃至出现库存问题
题目 1125: C语言训练-委派任务*
国产手机将用户变成它们的广告肉鸡,难怪消费者都买iPhone了
Vscode搭建ESP32-C3开发环境
全面质量管理理论
在金融服务行业数字化转型中,低代码值得被关注
力扣 206.反转链表--递归解决
中国互联网科技企业群狼围攻,谷歌终于遭受重挫导致利润大跌,它为推动鸿蒙的发展而后悔...
基于降噪自编码器与改进卷积神经网络的采煤机健康状态识别
EA&UML日拱一卒-活动图::Object actions(续)
Domestic mobile phones turn users into their advertising broilers, no wonder consumers are buying iPhones
How to Improve Embedded Programming with MISRA
搞直播啦,千视超高清4K NDI编解码器8月3日19:00准时开播
第二轮Okaleido Tiger热卖的背后,是背后生态机构战略支持