jstack排查cpu使用率过高

jstack排查cpu使用率过高

步骤:

1.top命令找出最高占用的进程(command为java)

2.查看高负载进程下的高负载线程:top -Hp 【PID】 (或 ps -mp PID -o THREAD,tid,time)

3.找出最高占用的线程并记录thread_id,把线程号 进行换算成16进制编号:printf ‘0x%x’ thread_id

4.(可选)执行查看高负载的线程名称:jstack 16143【进程】 | grep 3fb6【线程】

5.导出进程的堆栈日志,找到3fb6 这个线程号:jstack 16143 >/home/16143.log

实例操作:

背景:监控系统突然告警,提示服务器cpu负载过高。

一、方法a(最传统方法):定位出问题的线程

1、执行:top
在这里插入图片描述
得到占用cpu最高的进程是:19064

2、top -Hp 19064
查看高负载进程下的高负载线程
在这里插入图片描述
得到占用cpu最高的线程是:19209

把线程号 19209 进行换算成16进制编号:0x4b09
在这里插入图片描述
3、jstack 19064 | grep 4B09 -A 30
找到线程堆栈。-A 30表示打印30行
在这里插入图片描述

4、jstack 19209 >/data/log/19209.log

导出进程的堆栈日志,找到0x4b09 这个线程号

附加:
方法 b: show-busy-java-threads

这个脚本来自于github上一个开源项目,项目提供了很多有用的脚本,show-busy-java-threads就是其中的一个。使用这个脚本,可以直接简化方法A中的繁琐步骤。如下,

# wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads
# chmod +x show-busy-java-threads
# ./show-busy-java-threads

show-busy-java-threads
#从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈
#缺省会自动从所有的Java进程中找出最消耗CPU的线程,这样用更方便
#当然你可以手动指定要分析的Java进程Id,以保证只会显示你关心的那个Java进程的信息
show-busy-java-threads -p <指定的Java进程Id>

show-busy-java-threads -c <要显示的线程栈数>

方法 c: arthas thread

阿里开源的arthas现在已经几乎包揽了我们线上排查问题的工作,提供了一个很完整的工具集。在这个场景中,也只需要一个thread -n命令即可。

# curl -O https://arthas.gitee.io/arthas-boot.jar # 下载
# java -jar arthas-boot.jar

要注意的是,arthas的cpu占比,和前面两种cpu占比统计方式不同。前面两种针对的是Java进程启动开始到现在的cpu占比情况,arthas这种是一段采样间隔内,当前JVM里各个线程所占用的cpu时间占总cpu时间的百分比。

好了,这就是jstack排查cpu使用率过高的办法了,如有问题可与博主一起交流讨论!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值