线上CPU飙高或者发生死锁应该如何排查

223 阅读2分钟

线上CPU飙高或者发生死锁应该如何排查,方法很多种,可以借助于arthas命令,也可以手动通过命令排查

1. 如何排查


   1. top :找出CPU占比比较高的进程,得到pid
      top 按照-M -P, 内存和CPU使用率排序,也可以-H
    
 
   2. jstack pid > show.txt,  jstack命令保存一个进程中线程的状态
      或者也可以jstack pid | grep 转换后的十六进制 -c5
      打印栈的前后5行,会自动的把你的死锁信息打印出来的
   
   
   3. top -Hp pid, 得到线程号,  
      printf "%x" 23265 得到线程号的16进制,或者查看网址https://tool.lu/hexconvert/
   
   4. 在show.txt文件里面搜索线程号的16进制

2. 我处理过的具体实例

2.1 线上确实计算量大

线上的机器CPU升高,原本就很高, 首先top 命令查看,抓到cpu占比最高的java线程,然后top -Hp pid,进入看了一下,好几个线程CPU都高,结合业务数据量的猜想,应该就是机器负载过高导致的CPU过载

解决方案 限流、 升配、 扩容(由于我们是消费的sls实例,数据只允许有4个分片shard,所以扩容不管用)、下实例来降低数据

3. arthas 排查命令

thread -n 3 -i 1000 : 列出 1000ms 内最忙的 3 个线程栈

image.png

"thread2"为线程名称,在平时创建线程或线程池时请务必取一个见明之义的线程名称,方便排查问题
prio=6:线程优先级,不用关心;
tid=0x0000000006540800:线程id,不用关心;
nid=0x2be4:操作系统映射的线程id, 非常关键,后面再使用jstack时补充。
waiting for monitor entry:表示线程正在等待获取锁
0x0000000006dbf000:线程栈起始地址

每10秒刷新一次,3次后停止 dashboard -i 10000 -n 3

4. 一些帅气的使用案例

github.com/alibaba/art…