暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

怎么查看占 cpu 最多的线程

五角钱的程序员 2020-08-17
579
点击上方“五角钱的程序员”,选择“设为星标
第一时间关注技术干货!

✨一起学习、成长、温情的热爱生活✨  




前言:

某些线上服务,一段时间之内占用CPU特别高,如何确认这是否属于正常情况还是代码中出现了异常导致占用CPU特高呢?如何定位确认是哪个线程导致的?如何确认下是哪部分代码导致的CPU使用率偏高呢?

当然CPU使用高,并不一定意味着是有问题的,下面的方法仅用于排插问题的时候使用,例子也仅作为参考。(PS下面最终查询出来的具体代码使用CPU高是正常情况,这个需根据具体的业务场景去确认) 


1. 使用top命令确认是哪个进程占用CPU高。

[hadoop@hadoop102 ~]$ top

  如下图,我们发现PID为16268的CPU使用率比较高。
    



2. 显示当前进程下的所有线程列表

  ps -mp pid -o THREAD,tid,time

[hadoop@hadoop102 hadoop-2.7.2]$ ps -mp 16268 -o THREAD,tid,time




3.找到耗时最高的线程TID,并将其线程ID转换为16进制格式:
 
 printf "%x\n" tid

[hadoop@hadoop102 hadoop-2.7.2]$ printf "%x\n" 16268
3f8c


4. 打印线程的堆栈信息,thread dump
 
 jstack pid |grep tid -A 30
  
进一步分析堆栈信息,就会定位到问题所在



最后,总结下排查CPU故障的方法和技巧有哪些:

1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。

2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。

3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。

4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。




结束!

// END
推荐阅读:
99%的人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系
「JAVA」何谓“IO篇 流的使用
你真的知道面向过程和面向对象的区别吗?
你真的知道equals和==的区别吗?
普通人如何全面了解大数据的特点,意义和发展前景
如何搜到你想要搜到的东西?
作者:BossXiang,可爱且懂得生活的研究生一枚(码农一枚)。
"一起学习、成长、温情的热爱生活。"
私人微信|zijietiaodongpro (字节跳动pro)
CSDN|知乎|github|掘金:五角钱的程序员 

关注福利
关注公众号,后台回复【电子书】
几百本常用技术类电子书籍

五角钱的程序员

希望这篇文章可以帮到你~
欢迎大家点个在看,分享至朋友圈


你我都成为光发热之人,在看在看在看~(疯狂暗示!)
文章转载自五角钱的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论