新项目上线初期经常会遇到CPU过高或者线程卡死问题,这虽然是两类性能瓶颈问题,但是定位方法一致,项目中也遇到过几次,分享下定位经验
1、登录项目所在服务器,直接执行top命令,可以看到cpu使用情况,详细看到某个进程占用cpu的情况和执行时间,此时一般会发现某个进程占用cpu超过100%,且执行时间特别长,此进程一般就是罪魁祸首。
利用ps -ef | grep 1388924可以发现此进程为项目执行的进程
2、找到占用cpu过高或者执行时间很长的进程,然后执行top -Hp 1388924(进程号),可以查看该进程下的具体线程的执行信息,可以发现33861线程主要耗CPU且执行时间比较长,可以确定此线程有问题
3、执行命令导出线程信息jstack 33861 >/data/jstack/jstack.log,可以把jvm的线程执行信息保存到文件中,通过工具下载到本地进行分析
4、利用linux的printf命令转化线程号为十六进制,线程信息的线程号为十六进制,执行printf "%x\n" 33861,结果为8445
5、打开statck.log进程信息,搜索nid=0x8445的进程,查看堆栈日志即可,通过堆栈日志即可找到是哪行代码导致cpu占用cpu过高或者卡死(此图非33861线程的截屏,作为示例)
说明:cpu负载过高或者线程卡死还是比较好定位,基本都可以根据线程堆栈信息直接找到相关代码,分享下工作中遇到过相关情况,基本都是代码实现不当或者异常处理不当导致:
cpu过高:1、一直Full GC,其实已内存溢出
2、进行时间比较长的统计计算,对象长期无法释放
线程卡死: 1、http请求第三方,没有设置connect超时时间,长时间没有返回结果,卡死
2、线程从MQ获取数据,MQ本身已经挂掉,一直等待从MQ获取数据,导致程序无法 执行下去