服务出现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,可以很方便排查线上问题。
