Linux CPU占用率过高时问题排查
1.查看CPU占用率高的进程
1.1> top
1.2> 用ps -eo pid,pcpu | sort -n -k 2
2.确定高cpu消耗的线程
2.1>top -H
2.2>ps H -eo pid,tid,pcpu | sort -n -k 3
3.查看进程的线程
3.1>pstree -p pid
3.2>查看线程的相信信息:cat /proc/进程号/task/线程号/status
4.实时线程进程的资源占用信息
4.1>top -H -p pid
5.查看该进程下的所有线程
5.1>ps -efL | grep pid
5.2>根据pid,查找占用cpu较高的线程
ps -mp pid -o THREAD,tid,time
6.使用jstack定位线程堆栈信息,精确找到异常代码
6.1>查看某进程下占用CPU较高的线程:ps p 替换进程号 -L -o pcpu,pid,tid,time,tname,cmd
#!/bin/bash## 当JVM占用CPU特别高时,查看CPU正在做什么# 可输入两个参数:1、pid Java进程ID,必须参数 2、打印线程ID上下文行数,可选参数,默认打印10行#pid=$1if test -z $pidthenecho "pid can not be null!"exitelseecho "checking pid($pid)"fiif test -z "$(jps -l | cut -d '' -f 1 | grep $pid)"thenecho "process of $pid is not exists"exitfilineNum=$2if test -z $lineNumthen$lineNum=10fijstack $pid >> "$pid".bakps -mp $pid -o THREAD,tid,time | sort -k2r | awk '{if ($1 !="USER" && $2 != "0.0" && $8 !="-") print $8;}' | xargs printf "%x\n" >> "$pid".tmptidArray="$( cat $pid.tmp)"for tid in $tidArraydoecho "******************************************************************* ThreadId=$tid **************************************************************************"cat "$pid".bak | grep $tid -A $lineNumdonerm -rf $pid.bakrm -rf $pid.tmp
参考:https://www.jianshu.com/p/90579ec3113f
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
