当前位置: 首页 > 科技观察

Linux系统CPU占用率高的排查思路

时间:2023-03-19 21:15:57 科技观察

作为一名Linux运维工程师,在日常工作中,会遇到Linux服务器CPU负载达到100%并居高不下的情况。如果CPU持续高运行,将会影响业务系统的正常运行,给企业带来损失。很多运维同学遇到这种情况,往往一头雾水。通常,可以通过以下两种方法快速定位CPU过载问题:方法1.第一步:使用top命令,然后按shift+p按CPU排序找到占用CPU过多的进程的pid步骤2:使用top-H-p[processid]找到进程中消耗资源最多的线程的id步骤3:使用echo'obase=16;[threadid]'|bcorprintf"%x\n"[threadid]将线程id转为16进制(字母要小写)bc是linux的计算器命令Step4:Executejstack[processid]|grep-A10[threadidHexadecimal]”查看线程状态信息方法二第一步:使用top命令,然后按shift+p按CPU排序,找到占用CPU过多的进程第二步:使用ps-mppid-oTHREAD,tid,time|sort-rn获取线程信息,找到占用CPU高的线程第三步:使用echo'obase=16;[threadid]'|bc或printf"%x\n"[threadid]将需要的线程ID转换成十六进制的格式步骤四:使用jstackpid|greptid-A30[hexadecimalofthreadid]打印线程堆栈信息1)根据top命令,发现Java进程与PID2633占用CPU高达300%并发生故障。(2)找到进程后,如何定位具体的线程或代码,首先显示线程列表,按照CPU占用率高的线程排序:[root@localhost~]#ps-mp2633-oTHREAD,tid,time|sort-rn显示结果如下:找到最耗时线程(TID)3626,占用了12分钟的CPU时间!(3)将需要的线程TID转换为16进制格式[root@localhost~]#printf"%x\n"3626e18(4)***使用jstack命令打印出进程下本线程的堆栈信息:[root@localhost~]#jstack2633|grep"e18"-A30对比故障的解决,发现故障同样重要!市面上大部分监控软件都可以实现对服务器负载的实时观察,例如:Zabbix、Nagios、阿里云监控(针对云服务器)等,但是大部分软件都需要运维同学主动设置规则或者先发现问题,再发现问题。他们怎么会被动接收告警呢?推荐一款实用的运维软件——王教授,业务部署在阿里云上云端用户只需要绑定需要监控的只读AccessKey,云端资源的告警信息即可及时通知相应的团队成员。这种变主动为被动的方式,不仅减少了运维工程师的工作量,也减少了运维遗漏或忽略告警的发生。