问题:为什么cpu飙高会导致web应用挂掉,挂的流程是什么?
详情:我的springboot应用中有慢接口,接口需要遍历处理3W数据,用到了线程池3个核心线程,100w队列,一次请求平均响应需要30~50秒。
我连续请求该接口,也访问其他接口。cpu占到最高380%(4核心)。jvm内存4g占到1.8g。应用响应慢慢变慢,大约10分钟左右挂掉。
linux看demsg日志没看到kill相关。我本地windows起该应用同样访问接口会慢但不会挂掉。
我主动dump文件,看就是那个线程池再跑计算,其他请求在等。应用挂掉会出发springApplictionShutdownHook优雅关闭Hikari连接池等信息。
请帮分析下原理及排查办法。
为什么cpu飙高会导致web应用挂掉,挂的流程是什么?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
18条回答 默认 最新
- 专家-司宇[在线] 2023-11-08 10:51关注
获得0.30元问题酬金 引自强大而免费的微信小程序:皆我工具箱。
CPU飙高导致web应用挂掉的原因是因为CPU是计算资源的核心,当CPU占用率过高时,系统无法及时响应其他请求,造成系统负载过大,导致应用出现延迟甚至崩溃。
挂掉的流程一般是:
高CPU占用导致系统负载升高:当应用中存在慢接口或者计算密集型任务,会占用大量的CPU资源,导致CPU占用率升高。
系统无法及时处理其他请求:当CPU占用率过高时,系统无法及时响应其他请求,造成响应时间变长,影响用户的访问体验。
应用响应变慢:由于系统无法及时处理其他请求,导致应用响应时间逐渐变慢。
系统负载过高导致应用挂掉:当系统负载过高持续一段时间,超过系统的承载能力时,可能会导致应用崩溃或无法正常提供服务,进而挂掉。
针对你的情况,可能的原因有:
- 慢接口导致占用大量CPU资源
- 线程池的核心线程数和队列大小配置不合理,导致请求排队等待过长
- JVM内存不足,导致频繁GC和内存溢出
可以尝试的排查办法有:
- 检查慢接口是否存在性能优化的空间,比如是否可以对数据进行分页处理或者使用其他算法降低计算复杂度。
- 调整线程池的配置,适当增加核心线程数和队列大小,根据实际需求和系统负载情况进行调整。
- 检查JVM内存配置是否合理,适当增加内存大小以避免频繁GC和内存溢出。
- 使用性能监控工具(如jstack、jvisualvm等)对应用进行性能分析,查看具体哪个线程或方法耗费了大量的CPU资源。
- 检查应用的日志和错误信息,查看是否有其他异常或错误导致应用崩溃。
解决 3无用
悬赏问题
- ¥15 单纯型python实现编译报错
- ¥15 c++2013读写oracle
- ¥15 c++ gmssl sm2验签demo
- ¥15 关于模的完全剩余系(关键词-数学方法)
- ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
- ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
- ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
- ¥15 安装quartus II18.1时弹出此error,怎么解决?
- ¥15 keil官网下载psn序列号在哪
- ¥15 想用adb命令做一个通话软件,播放录音