当前位置: 首页 > news >正文

JAVA应用不定时卡顿问题排查过程记录

问题描述

服务上线后,接口不定时超时

  • 服务不可用时间可以长达6-10秒,但是似乎没有完全不可用,有一部分请求可以成功
  • 服务有多台机器,但是同一时间只有一台机器有问题
  • 同时redis也会超时,但是redis超时时间是1s,实际使用了远大于1s的时间
  • 一些同步阻塞队列设置了100ms的超时时间,实际没有被唤醒
  • 总体来说感觉有点类似gc时STW的情况

查看监控

  • GC的监控,没有长时间的暂停
    gc暂停监控
  • redis的写入耗时监控,确实时间很长
    redis写入监控
  • dubbo接口线程池打满时自动打印了堆栈,查看关键线程的堆栈
  • redis的io线程
    在这里插入图片描述
  • 业务线程
    在这里插入图片描述
  • 设置了睡眠时间的线程,没有在应该被唤醒时自动唤醒
    在这里插入图片描述

分析过程

  • 通过监控可以看到,io线程似乎都在等待io,睡眠线程也在正常睡眠,但是为什么会突然停住?
  • 一般常见的原因有GC,CPU打满。gc已经看过了没有长时间gc
  • 那么是否是因为短时间的cpu达到100%导致呢,由于我们的监控是分钟级监控,在监控上没有看到明显的变化,不代表秒级的cpu很高
  • 于是让运维在机器上每秒抓取vmstat的数据
    在这里插入图片描述
  • 可以看到在问题发生的时间段内,数据有明显的变化。运行任务数只有1,不可中断任务数为变成0,cpu使用率是7,明显低于正常状态的数据。线程切换次数也从正常20w变成只有几百。
  • 到这里已经非常奇怪了,为什么任务都不执行了?为什么卡主了?
  • 当时考虑的方向有,网络阻塞,线程锁,内存回收抖动
  • 于是又增加了内存脏页刷新数据的抓取,ping网络的数据抓取
    内存脏页数据
  • 可以看到问题时间内内存脏页也基本不变化了,说明不是问题原因
  • 网络延迟在问题时间段没有任何变化,网络没有问题
  • 锁的问题在线程堆栈文件中看过了,基本没有锁存在
  • 刚才考虑的方向基本都不是问题,最后想到,那个在卡顿时间内一直在执行的任务是什么任务?为什么它能执行?
  • 于是让运维每秒抓取top命令中R状态的线程
    在这里插入图片描述
  • 查看问题时间段内在执行的线程终于发现了24861这个线程
  • 查看这个线程的线程栈
    在这里插入图片描述
  • 一开始看到这个线程的线程栈时非常诧异,因为我们对外提供的是DUBBO接口,没有http接口访问。但这个线程是http接口线程,不应该有访问
  • 仔细查看堆栈发现是普罗米修斯拉取监控数据时的http请求
  • 普罗米修斯生成监控数据时会获取线程信息,可能会导致线程暂停
  • 那么会不会是这个原因导致?

问题确认

  • 首先从上面的top命令截图中可以确认,http请求线程开始执行的时间点就是问题开始的时间点,http请求线程结束的时间点也是问题恢复的时间点。从时间上来看完全符合

  • 查看历史dubbo打印的线程堆栈,搜索拉取线程的代码sun.management.ThreadImpl.getThreadInfo。发现每次堆栈中都有对应的代码堆栈。由此可以基本确认这个就是问题的根源

  • 后续又核对了几次问题发生时的情况,最终确认了这个就是源头。并且线程数量越多,该问题就越频繁。我们的应用有大概3000个线程,因此频繁触发此问题

  • 问题发生总结:首先由普罗米修斯通过http请求拉取监控数据,获取数据时会触发获取线程信息。然后所有线程都会暂停由一个name为VM Thread的jvm线程执行,执行时间会有几秒不等,http请求结束后卡顿结束

疑问(是否有大佬解答一下)

  • 获取线程信息时会导致部分线程停顿还是全部线程停顿?
  • 获取线程信息是纯内存操作,即使有3000个线程感觉也不需要6秒时间。为什么会如此耗时。不同线程进入安全点的时差导致的吗?

后记

  • dump 线程堆栈时是通过VM Thread线程执行的,所以不管有几个cpu,也只能有一个cpu在运行(上面问题vmstat日志里可以看到问题发生时间段内只有一个运行任务),所以在大规格的机器上运行有许多线程的java应用,这个问题的卡顿时间也越长
  • dubbo框架的线程池打满时也会触发dump 线程堆栈(或其他dump 线程堆栈操作),因此可能会导致短时间的一个卡顿转化为一个长时间的卡顿
http://www.jsqmd.com/news/771004/

相关文章:

  • 2026年贵阳观山湖室内装修全案设计深度指南:轻舟装饰vs行业头部品牌实测横评 - 优质企业观察收录
  • RAG 系统部署实战:从 Flask 到 Kubernetes
  • Android 13音频策略配置完全解读:从audio_policy XML文件到音量曲线与设备路由
  • D2RML:暗黑破坏神2重制版多账户并行游戏的智能工作流引擎
  • 国内主流净化板生产厂家实测排行 聚焦合规与交付 - 奔跑123
  • 2025届最火的六大AI科研神器实际效果
  • 2026年保定短视频代运营与GEO精准获客深度指南:制造业工厂、高端服务商如何突破获客困局 - 精选优质企业推荐官
  • 软件测试流程(含项目流程与测试执行细则)
  • 自动配料系统厂家推荐:浙江翔衡与杭州友衡如何实现高效稳定生产? - 品牌推荐大师
  • 别再手动下载了!用NVIDIA GeForce Experience一键搞定显卡驱动兼容性问题(保姆级教程)
  • 告别命令行!用Yakit图形化界面玩转Yak语言安全能力(附最新1.2.7版安装避坑指南)
  • 投票小程序永久免费使用
  • 80KB的Android PDF渲染革命:原生渲染引擎的极致轻量化实践
  • Spring Cloud Gateway聚合Knife4j文档的完整避坑指南:从白名单配置到路由过滤
  • OpenClaw爬虫Docker化部署:从容器封装到生产环境实践
  • 2026年四川围墙栏杆厂家哪家好 聚焦品质与服务 适配各类园区/市政需求 - 深度智识库
  • 2026年一体化客服软件,集成对话机器人与自动分配管理功能 - 品牌2026
  • OpenBoardView:专业电路板逆向工程与故障排查利器
  • 油敏肌不刺激防晒霜推荐来啦~6款温和修护不泛红的宝藏防晒 - 全网最美
  • 在线PH计怎么选?2026年国内十大品牌实测推荐 - 仪表人叶工
  • 3步永久备份QQ空间:小白也能轻松找回青春记忆的终极指南
  • 青岛鼎力信达起重设备租赁:市北区吊车出租电话多少 - LYL仔仔
  • 明日方舟MAA自动化工具终极指南:从零掌握游戏助手完整教程
  • 2026 四川全域正规旅行社 / 旅游公司口碑 TOP5 权威榜单 - 深度智识库
  • 影刀RPA如何实现店群自动化:从1688到TEMU,多浏览器并发重塑全平台运营矩阵
  • 机床防护罩哪家质量好售后服务好性价比高?三大主流品牌全方位对比 - 品牌推荐大师
  • 如何在PS4上轻松管理1490款游戏作弊代码:GoldHEN Cheats Manager完整指南
  • 对比直接使用官方API体验Taotoken在稳定性与路由上的优势
  • `std::atomic` 的 6 种 memory_order 到底该怎么选——从 store buffer 到 ARM `dmb` 指令,一张决策树解决 90% 的场景
  • 2026高端家装观察:定制装甲门选择指南与「臣和装甲门」深度解析 - 企师傅推荐官