性能问题优化:⇒
- 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。