【开发篇】十四、线程信息转储 + CPU高占用案例

性能问题优化:⇒

  • SQL优化
  • 业务代码优化
  • 内存调优
  • GC调优

1、性能问题现象

1)CPU占用率高

在这里插入图片描述

有进程的CPU占用率极高(多核CPU下甚至超过100%),说明在进行大量的计算,但一般的接口都与数据库有交互(存在IO),这里的99%,很可能是陷入了死循环或者过于长的循环

2)请求处理时间很长

在这里插入图片描述

微服务架构下,使用skywalking等分析是哪个接口响应慢,以及这个接口的哪一段span慢,是查Redis还是查MySQL,又或是执行哪一个方法慢

3)内存和GC正常,但运行一段时间后无法处理新需求,可能是可用线程被耗尽

2、线程转储

jstack下:

jstack PID号	 
jstack PID> thread.tdump

在这里插入图片描述

VisualVM下转储:

在这里插入图片描述

转储文件中有线程名、优先级、线程ID、线程状态以及对应的栈信息

在这里插入图片描述

转储文件可视化分析平台:

在这里插入图片描述

3、案例:CPU占用率高

服务器CPU占用率一直很高 ⇒ top -c 找到CPU占用率高的那一个进程,拿到PID

在这里插入图片描述

top -p 进程ID,单独监控某个进程,按H查看其下的所有线程,即每个线程的资源占用

在这里插入图片描述

转储:

jstack 进程ID > /root/thread.tdump

从转储文件中找到nio等于刚才top -p排第一的线程号

//转储文件中nio是十六进制,这里转一下
printf '%x\n' 线程ID

在这里插入图片描述

找到问题代码:

在这里插入图片描述

最后,分析CPU占用高的问题,重点关注RUNNABLE状态的线程。但一些线程执行本地方法时并不消耗CPU,只是在等待,但也会被JVM标记为RUNNABLE状态:

在这里插入图片描述

以上:等待socket读取数据,IO等待不消耗CPU。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-代号9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值