方法一
第一步:使用
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,即可将云上资源的告警信息及时通知给对应的团队成员。
化主动为被动的方式,一方面减轻了运维工程师的工作,另一方面也减小了运维漏看或者忽略告警的情况发生。
可按以下四个方法解决CPU占用率过高的问题:在运行大型程序之前,查看电脑配置是否满足运行该程序的最低配置,如果确实是电脑配置不行的话,那么就建议将电脑硬件进行升级了
下载杀毒软件或者木马专杀对电脑进行保护,可以使用占用资源小的一些安全工具,例如巨盾,巨盾采用脚本引擎可以极大的释放系统资源,不会使得电脑CPU使用率过高
在使用浏览器时尽量选择一些用户群体比较多的浏览器,一些非主流的浏览器就不必使用了,因为小众的浏览器在兼容性, *** 作性等方面还是有些缺陷的,系统优化也不完善,所以建议使用主流的浏览器,避免出现CPU使用率高怎么办的问题
定期更新电脑各种驱动,可以使用驱动精灵等工具自动更新电脑上的驱动,保持电脑驱动处于最新状态,减少CPU出现100%的概率。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)