服务出现OOM,cpu飙升至100%原因调查及解决方法

一天,业务突然反馈说服务没法访问,于是我把java服务的堆内存dump出来,赶紧重启服务,毕竟让业务恢复正常是第一紧急的。重启完服务开始分析原因,调取了服务监控信息,发现cpu突然在一个时间点飙升到100%了,又看了数据库所在的服务器监控信息,数据库的cpu和内存都是正常的,cpu使用率在同一个时间点有所提升,但不是很明显

服务所在的服务器cpu和内存使用情况:

数据库所在的服务器cpu和内存使用情况:

于是,开始查这个时间点附近的日志,这个服务没有定时任务,所以这个可能性排除,那剩余的就是用户请求和mq消息处理了,于是挨个看每条日志,突然一个可疑的日志出现在眼前:

2022-03-26 16:55:48.304 [xxx] [0a000c1e16482849483047016] [http-nio-9077-exec-7-http-nio-9077-exec-7] INFO   - 用户发起请求,请求方法:XXXmethod,请求参数:[{}]

这个请求前端传了空的map,于是我开始找到后端对应的代码,发现后端没有对参数做校验,这个参数缺失最终导致把表的全部数据加载到内存了,然后服务就直接OOM了。

接下来就是解决问题,找到原因解决起来就轻松多了,对参数加上校验,问题解决。

总结下解决的思路:

1.首先检查服务的cpu,内存,磁盘,网络带宽,负载是不是正常

2.检查数据库的cpu,内存,磁盘,网络带宽,负载是不是正常

3.如果是服务cpu100%,检查下发生问题的时间点有没有定时任务执行,或者那个时间段业务量是不是突然增高,比如大量图片压缩,几百万行数据转json或者利用反射转对象,或者某个请求加载了大量数据。

4.如果是数据库cpu100%,检查下是不是有慢查询,导出慢查询日志分析下。

5.检查下堆内存是否存在内存泄漏,可以用MAT,或者JVisualVM分析,另外推荐一个不错的工具arthas,可以很方便排查线上问题。

经验分享 程序员 微信小程序 职场和发展