linux cpu使用率过高排查

 我来答
兄弟连田心9号
2020-11-09 · TA获得超过38万个赞
知道顶级答主
回答量:12.3万
采纳率:87%
帮助的人:1.2亿
展开全部

方法一

第一步:使用

top命令,然后按shift+p按照CPU排序

找到占用CPU过高的进程的pid

第二步:使用

top -H -p [进程id]

找到进程中消耗资源最高的线程的id

第三步:使用

echo 'obase=16;[线程id]' | bc或者printf "%x\n" [线程id] 

将线程id转换为16进制(字母要小写)

bc是linux的计算器命令

第四步:执行

jstack [进程id] |grep -A 10 [线程id的16进制]”

查看线程状态信息

方法二

第一步:使用

top命令,然后按shift+p按照CPU排序

找到占用CPU过高的进程

第二步:使用

ps -mp pid -o THREAD,tid,time | sort -rn

获取线程信息,并找到占用CPU高的线程

第三步:使用

echo 'obase=16;[线程id]' | bc或者printf "%x\n" [线程id]

将需要的线程ID转换为16进制格式

第四步:使用

jstack pid |grep tid -A 30 [线程id的16进制]

打印线程的堆栈信息

案例分析

场景描述

生产环境下JAVA进程高CPU占用故障排查

解决过程

1、根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。

2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:

1

   

[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn

   

显示结果如下:


找到了耗时最高的线程(TID)3626,占用CPU时间有12分钟了!

3、将需要铅数的线程TID转换为16进制格式

12

   

[root@localhost ~]# printf "%x\n" 3626e18

   

4、最后使用jstack命薯信令打印出该进程下面的此线程的堆栈信息:

1

   

[root@localhost ~]# jstack 2633 |grep "e18" -A 30

   

相比故障的解决而言,发现故障也同等的重要!市场上的大多数监控软件都能实现服务器槐手首负载的实时观测,比如:Zabbix、Nagios、阿里云监控(针对云服务器)等。但是当中大部分的软件都需要运维同学主动去设置规则或者检测才能发现问题,如何被动的也能收到告警呢?

推荐大家一个实用的运维软件——王教授,对于业务部署在阿里云上的用户,只需绑定需要监控的只读AcessKey,即可将云上资源的告警信息及时通知给对应的团队成员。

化主动为被动的方式,一方面减轻了运维工程师的工作,另一方面也减小了运维漏看或者忽略告警的情况发生。

巍峨又顺眼的小鲤鱼q
高粉答主

2021-01-04 · 关注我不会让你失望
知道答主
回答量:10.5万
采纳率:7%
帮助的人:5202万
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式