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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部