一次线上CPU高的问题排查实践

一次线上CPU高的问题排查实践

前言

近期某一天上班一开电脑,就收到了运维警报,有两台服务CPU负载很高,同时收到一线同事反馈 系统访问速度非常慢,几乎无响应。

一个美好的早晨,最怕什么就来什么。只好推掉其他会议,专心搞定问题。

排查

登录系统一看,后端的接口访问果然全部超时。

1.先使用top命令查看下是由哪个进程占用CPU较高。
在这里插入图片描述
从图上可看出,pid=26481的Java进程占用了385%的CPU,机器是4核8G的配置。

2.然后查看下是哪个Java应用 ps -ef | grep java
在这里插入图片描述
发现是我们后端request服务的应用。

3.获取pid后,可以查看该进程下的线程列表。 命令: ps -mp pid -o THREAD,tid,time。
在这里插入图片描述

这里我们可以看出有4个线程,长时间占用较高的CPU资源。拿到一个tid=26496,printf “%x\n” tid , 转为16进制:6780

4.使用jstack打印线程的堆栈信息,./jstack pid | grep tid -A 30
在这里插入图片描述

从图上可看出,是由于该应用的GC异常导致CPU占用较高。

5.导出堆栈日志分析。 jstack 26481 >> jstat.out
在这里插入图片描述

解决问题

分析导出jstat.out,查找下RUNNABLE状态的线程。

ps:这里推荐一个分析日志的网站,超级好用,能生成图形界面的分析日志。只需要将生产的日志上传。Java Thread Dump Analyzer https://fastthread.io/

1561301189115

在这里插入图片描述

最终发现是Excel大量导出的问题。用户导出一年的财务报表,差不多近60万条数据,由于系统导出较慢,然后进行了多次点击下载,导致应用内存不足,频繁GC, 导致CPU超高,系统假死。

至此问题发现,解决问题就变得简单了。

  • 重启应用,让用户使用优先。 最快捷、最有效的解决方式,哈哈
  • 前端限制按钮点击次数。
  • 后端Excel下载优化(考虑阿里的easyexcel,详细请看后续分享),以及将文件下载独立出一个微服务。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值