linux系统故障排查(一):CPU使用率过高

一、通过top命令定位占用cpu高的进程

执行top命令得到以下结果(P按照进程负载排序):

通过上图可以明显看出进程PID2221 明显存在问题,定位到了进程id。为了更好的排查问题,下面详细介绍top命令显示的含义。

1)第一行是任务队列信息
top - 14:06:34 up 537 days, 6 min, 6 users, load average: 0.41, 0.45, 0.43

任务队列信息含义
14:06:34当前时间
537 days系统运行时间
6 min用户在线时间
6 users在线用户数
load average: 0.41, 0.45, 0.43系统负载,即任务队列的平均长度。1分钟前、5分钟前、15分钟前平均负载

2) 第二行为进程的信息

进程信息含义
Tasks: 1 total进程总数
0 running正在运行的进程数
1 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数

3)第三行为cpu信息

cpu信息含义
6.1% us用户空间占用CPU百分比
1.5% sy内核空间占用CPU百分比
0.0% ni用户进程空间内改变过优先级的进程占用CPU百分比
92.2% id空闲CPU百分比
0.0% wa等待输入输出的CPU时间百分比
0.0% hi硬件中断
0.0% si软件中断
0.0%st实时

4)第四、五行为内存信息,内容如下:

物理内存信息含义
Mem: 191272k total物理内存总量
173656k used使用的物理内存总量
17616k free空闲内存总量
22052k buffers用作内核缓存的内存量
交换区信息含义
Swap: 192772k total交换区总量
0k used使用的交换区总量
192772k free空闲交换区总量
123988k cached缓冲的交换区总量

二、通过top命令定位问题进程中每个线程占用cpu情况

top -Hp 2221

查看进程PID 2221的每一个线程占用CPU情况,如图。  

由上图明显可以发现,线程PID2244CPU占用率最高,接下来定位该线程的代码是否出现异常导致cpu占用过高。

三、通过jstack 命令定位问题代码

上一步发现线程PID2244占用的CPU过高,就将这个PID转换成16进制

printf “%x\n”  线程PID
printf “%x\n”  2244

PID 2244转化成16进制为8c4。使用如下命令命令定位问题代码: 

jstack pid |grep tid -A 30(pid:进程id,tid:线程id)
jstack 2221 | grep 8c4 -A 30

或者
jstack 2221| grep 8c4  -C5 --color

RUNNABLE 线程运行中或I/O等待
BLOCKED 线程在等待monitor锁(synchronized关键字)
TIMED_WAITING 线程在等待唤醒,但设置了时限
WAITING 线程在无限等待唤醒

线程在等待的状态。查看代码

public String testCode(){
    test();
    return  "success";
}

public void test(){
    while(true){
       for(int i=0;i<10;i++){

        }
     }
}

 while循环无法结束,一直抢占cpu,导致程序cpu使用过高,修改代码即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值