作为Linux运维工程师,在日常工作中我们会碰到Linux服务器上出现CPU负载达到100%居高不下的情况,若果CPU持续跑高,则会影响业务系统的正常运行,带来企业损失。
好多运维的朋友遇见这些状况常常会不知所措,对于CPU过载问题一般使用以下两种方法即可快速定位:
方式一
***步:使用
top命令linux内核占用cpu高,之后按shift+p根据CPU排序
找到占用CPU偏低的进程的pid
第二步:使用
top-H-p[进程id]
找到进程中消耗资源***的线程的id
第三步:使用
echo'obase=16;[线程id]'|bc或则printf"%xn"[线程id]
将线程id转换为16补码(字母要大写)
bc是linux的估算器命令
第四步:执行
jstack[进程id]|grep-A10[线程id的16补码]”
查看线程状态信息
方式二
***步:使用
top命令RED HAT LINUX 9.0,之后按shift+p根据CPU排序
找到占用CPU偏低的进程
第二步:使用
ps-mppid-oTHREAD,tid,time|sort-rn
获取线程信息,并找到占用CPU高的线程
第三步:使用
echo'obase=16;[线程id]'|bc或则printf"%xn"[线程id]
将须要的线程ID转换为16补码格式
第四步:使用
jstackpid|greptid-A30[线程id的16补码]
复印线程的堆栈信息
案例剖析
1.场景描述
生产环境下JAVA进程高CPU占用故障排查
2.解决过程
(1)依据top命令,发觉PID为2633的Java进程占用CPU高达300%,出现故障。
(2)找到该进程后linux内核占用cpu高,怎样定位具体线程或代码呢,首先显示线程列表,并根据CPU占用高的线程排序:
[root@localhost~]#ps-mp2633-oTHREAD,tid,time|sort-rn
显示结果如下:
找到了历时***的线程(TID)3626,占用CPU时间有12分钟了!
(3)将须要的线程TID转换为16补码格式
[root@localhost~]#printf"%xn"3626e18
(4)***使用jstack命令复印出该进程下边的此线程的堆栈信息:
[root@localhost~]#jstack2633|grep"e18"-A30
相比故障的解决而言,发觉故障也同等的重要!市场上的大多数监控软件都能实现服务器负载的实时观测linux系统安装,例如:Zabbix、Nagios、阿里云监控(针对云服务器)等。并且当中大部份的软件都须要运维朋友主动去设置规则或则检查能够发觉问题,怎么被动的也能收到告警呢?
他强由他强,清风拂山冈。他横任他横,明月照大江。