背景:生产环境,当服务1重启后,CPU会彪高,然后生产环境告警。
1、服务器抓去进程中占用CPU最高的线程,查看当前引用进程信息,包括内存与CPU占用百分比
用Top命令执行查看使用最高的CPU,得到PID(比如“30410”)
ps aux |grep PID(查询进程所在服务,PID-进程号,TID-线程号)
就清楚是哪个服务发生的CPU飙高了。
2、jstat -gc pid 1000 15(查看FGC、FGCT,如果一秒内超过1次,算是高了,41947-41945=2)
3、打印3次该进程中CPU占比高的线程 top -b -n 3 -Hp PID(查看第2或者第三次)
4、拿到CPU占用高的线程,需要转16进制后,就可以查询打印的堆栈信息,看具体线程信息
打印该进程堆栈信息(Java命令需要确认是否服务器能直接调用,不行则需要到jdk目录下执行)。
jstack $pid(可以使用jstack $pid >>$url将堆栈信息打印到该文件中,使用十六进制的线程号查看自己的类即可,底层源码暂不用管)
根据转16进制后的线程号去查询出占用CPU最高的信息找到相关的类
可用命令转16进制
printf "%x\n" 24740
这一步之后就知道具体问题在哪个类中的哪个方法了,具体分析。
比如我们的就是在重启的时候,dubbo消费者会循环调用生产者的信息,每次启动都会订阅所有同类接口,导致了一直占用资源。
修改方式:公司原架构是,生产者有多个服务,且都是用的同一套接口(名称),修复后为,不同的接口用不同的interface。