前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM实操篇-线上CPU占用飙升99%,系统响应延时飙升访问偶发白屏

JVM实操篇-线上CPU占用飙升99%,系统响应延时飙升访问偶发白屏

原创
作者头像
极简架构
发布2023-01-04 09:28:40
7050
发布2023-01-04 09:28:40
举报
文章被收录于专栏:kimzekimze

问题背景:

线上web应用系统java进程运行一段时候后,出现系统响应延迟飙升,访问系统出现偶发白屏

问题排查过程:

1.top查看jvm进程占用cpu飙升至99%

运行一段时间后cpu占用99%

访问系统白屏假死-很长时间才响应

2.怀疑jvm默认参数设置不合理: 排查jvm参数设置

jvm参数设置不合理:eden区占用较高 & meta space较小优化jvm参数

gc-log显示 eden区大小不够优化jvm参数

3.jvm参数优化后堆内存无压力:

jvm参数优化后堆内存无压力

metadata区满了: 不够用 -> 增大 meta区大小

-XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M

meta space占用

4.优化jvm参数后(运行一段时间后cpu占用还是飙升到99%) 且系统负载较高

排查cpu飙升过程:

代码语言:javascript
复制
vmstat 1 4
pidstat -p 866 -u -t 1 3   -> 查找占用cpu较高线程id 2109
printf "%x" 2109  -> 83d  -> 问题线程nid: 0x83d  

5.打印线程堆栈信息: 发现死锁问题

代码语言:javascript
复制
jstack -F -l 2109  >> /home/work/zhibi/jstack_2109_83d.txt  ->  Thread 2109: (state = IN_NATIVE)  cpu 98% 发现有死锁

redis连接资源获取死锁问题

5.定位问题代码行

问题原因为: 获取Redis资源死锁问题 -> 修复即可。

定位死锁稳定代码行:

定位死锁问题代码行

问题代码行:

问题行加锁并发竞争激烈时会BOLCKED线程执行

线程由于获取jedis连接而被BLOCKED阻塞,列举几个问题线程堆栈如下: 【实际Redis是单线程操作无需加锁,小伙伴获取jedis连接写法有问题】

锁定jedis代码行

排查线程堆栈:

显示有多个接口被jedis获取锁阻塞,以下皆为等待jedis释放锁状态被BLOCKED 的线程 问题代码行

1.获取设备接口

2.心跳接口

  1. 物料接口

修复问题代码:

Redis是单线程操作无需加锁,获取jedis连接去掉加锁操作

我是架构师kimze,喜欢我的文章欢迎关注我,

我会坚持分享干货: 互联网微服务架构、云原生架构、行业动态、经典案例、技术趋势,

有问题欢迎关注私信或评论区回复交流

点赞、收藏、转发、评论 对我是一种支持,感谢!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景:
  • 问题排查过程:
  • 修复问题代码:
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档