定位CPU占用高的线程并打印其堆栈信息

1、首先使用top命令定位到CPU占用高的进程PID

执行top命令,列出所有进程的情况,然后按大写的'P',按CPU占用大小降序显示进程信息

2、获取线程信息,并找到CPU占用高的线程

ps -mq pid -o THREAD,tid,time | sort -rn

3、将需要的线程ID转换为16进制格式

printf "%x\n" tid

4、使用pstack打印进程堆栈信息

  pstack是一个shell脚本,用于打印正在运行的进程的栈跟踪信息,它实际上是gstack的一个链接,而gstack本身是基于gdb封装的shell脚本。此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。pstack是gdb的一部分,如果系统没有pstack命令,使用yum搜索安装gdb即可

  这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发现代码栈总是停在同一个位置,那个位置就需要重点关注,很可能就是出问题的地方。如:

pstack pid > 1.txt;
pstack pid > 2.txt;
pstack pid > 3.txt;

  可查看1.txt,2.txt和3.txt文件中对应线程ID的堆栈情况,有时pstack并不能一次抓到有用的信息,多执行几次试试。

  注:pstack打印的线程ID为16进制的

 

5、补充

ps -eLo pid,lwp,pcpu |grep pid

  另外也可使用如上简单的命令定位到哪段程序可能存在性能问题:获取进程ID,通过pstack命令查看其中各个线程id以及对应的线程现在正在做的事情,分析多组数据就可以定位到哪些线程里有慢操作影响了服务器的性能,从而得到解决方案:

 

 

 由此可以判断LWP 30222这个线程产生了性能问题,执行时间长达31.4毫秒,再观察其堆栈信息,停留在如下几个语句,只需要简单排查就可知道问题瓶颈。

posted @ 2021-02-25 19:49  阿玛尼迪迪  阅读(1214)  评论(0编辑  收藏  举报