日常Bug排查-系统失去响应-Redis使用不当

前言

日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材^_^。

Bug现场

开发反应线上系统出现失去响应的现象,收到业务告警已经频繁MarkAndSweep(Full GC)告警。于是找到笔者进行排查。

看基础监控

首先呢,当然是看我们的监控了,找到对应失去响应的系统的ip,看下我们的基础监控。

机器内存持续上升。因为我们是java系统,堆的大小一开始已经设置了最大值。

--XX:Xms2g -Xmx2g

所以看上去像堆外内存泄露。而FullGC告警只是堆外内存后一些关联堆内对象触发。

看应用监控

第二步,当然就是观察我们的应用监控,这边笔者用的是CAT。观察Cat中对应应用的情况,很容易发现,其ActiveThread呈现不正常的现象,竟然达到了5000+多个,同时和内存上升曲线保持一致。

jstack

java应用中遇到线程数过多的现象,首先我们考虑的是jstack,jstack出来对应的文件后。我们less一下,发现很多线程卡在下面的代码栈上。

"Thread-1234java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park......at org.apache.commons.pool2.impl.LinkedBlockingQueue.takeFirst......at redis.clients.util.Pool.getResource

很明显的,这个代码栈值得是没有获取连接,从而卡住。至于为什么卡这么长时间而不释放,肯定是由于没设置超时时间。那么是否大部分线程都卡在这里呢,这里我们做一下统计。

cat jstack.txt | grep 'prio=' | wc -l
======> 5648
cat jstack.txt | grep 'redis.clients.util.Pool.getResource'
======> 5242

可以看到,一共5648个线程,有5242,也就是92%的线程卡在Redis getResource中。

看下redis情况

netstat -anp | grep 6379
tcp 0 0 1.2.3.4:111 3.4.5.6:6379 ESTABLISHED
......

一共5个,而且连接状态为ESTABLISHED,正常。由此可见他们配置的最大连接数是5(因为别的线程正在得到获取Redis资源)。

Redis连接泄露

那么很自然的想到,Redis连接泄露了,即应用获得Redis连接后没有还回去。这种泄露有下面几种可能:
情况1:

情况2:

情况3:
调用Redis卡住,由于其它机器是好的,故排除这种情况。

如何区分

我们做个简单的推理:
如果是情况1,那么这个RedisConn肯定可以通过内存可达性分析和Thread关联上,而且这个关联关系肯定会关联到某个业务操作实体(例如code stack or 业务bean)。那么我们只要观察其在堆内的关联路线是否和业务相关即可,如果没有任何关联,那么基本断定是情况2了。

可达性分析

我们可以通过jmap dump出应用内存,然后通过MAT(Memory Analysis Tool)来进行可达性分析。

首先找到RedisConn

将dump文件在MAT中打开,然后运行OQL:

select * from redis.clients.jedis.Jedis (RedisConn的实体类)

搜索到一堆Jedis类,然后我们执行

Path To GCRoots->with all references

可以看到如下结果:

redis.clients.jedis.Jedis|->object |->item|->first|->...|->java.util.TimerThread|->internalPool

由此可见,我们的连接仅仅被TimerThread和internalPool(Jedis本身的连接池)持有。所以我们可以判断出大概率是情况2,即忘了归还连接。翻看业务代码:

伪代码
void lock(){conn = jedis.getResource()conn.setNx()// 结束,此处应该有finally{returnResource()}或者采用RedisTemplate
}

最后就是很简单的,业务开发在执行setNx操作后,忘了将连接还回去。导致连接泄露。

如果是情况1如何定位卡住的代码

到此为止,这个问题时解决了。但是如果是情况1的话,我们又该如何分析下去呢?很简单,我们如果找到了jedis被哪个业务线程拥有,直接从heap dump找到其线程号,然后取Jstack中搜索即可知道其卡住的代码栈。

jmap:
redis.clients.jedis.Jedis|->Thread-123jstack:Thread-123 prio=...at xxx.xxx.xxx.blocked

总结

这是一个很简单的问题,知道套路之后排查起来完全不费事。虽然最后排查出来是个很低级的代码,但是这种分析方法值得借鉴。

日常Bug排查-系统失去响应-Redis使用不当相关推荐

  1. Windows系统入侵排查与应急响应技术

    文章目录 前言 入侵排查 系统账户排查 进程端口排查 启动项的排查 计划服务排查 系统信息排查 日志信息排查 应急工具 总结 前言 前面一篇文章:浅析Linux系统入侵排查与应急响应技术 介绍了 Li ...

  2. 同程旅行王晓波:同程凤凰缓存系统在基于 Redis 方面的设计与实践(上篇)

    王晓波 同程旅行机票事业群 CTO 读完需要 12 分钟 速读仅需 4 分钟 本章和大家分享一下同程凤凰缓存系统在基于 Redis 方面的设计与实践.在本章中除了会列举我们工作过程中遇到各种问题和误区 ...

  3. java redis使用卡死_记一次找因 redis 使用不当导致应用卡死 bug 的过程

    原标题:记一次找因 redis 使用不当导致应用卡死 bug 的过程 作者:小木 my.oschina.net/xiaomu0082/blog/2990388 首先说下问题现象:内网sandbox环境 ...

  4. 苹果当前系统时间与服务器不一致,苹果iOS14时钟Bug与系统时间不同 比系统时间慢了3小时...

    苹果iOS14时钟Bug与系统时间不同 苹果刚发布了iOS14正式版,新增了类似于安卓负一屏的功能,可以添加时钟组件.近日,网友发现iOS14时钟出现Bug,时钟插件显示时间比系统时间慢了整整三个小时 ...

  5. 【Unity3D日常BUG】Unity3D中导入Obi插件出现的错误:DLLNotFouindException:libOni

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦. 一.前言 ...

  6. windows10系统php扩展redis详细安装过程 win10 php redis扩展

    想在win10系统下安装php的redis扩展并且运行有redis扩展的项目,主要分两步 1.安装redis扩展 2.运行redis服务器 先看第一个 1.安装redis扩展 a.首先要查自己系统的P ...

  7. 【升级公告】让双控更到位,晓帆隐患排查系统三大升级

    好久不见,我们有个好消息跟大家分享--晓帆隐患排查系统升级啦!! 相比原来的版本,我们做了六大升级,新版本让晓帆隐患排查系统更简洁易用,帮大家解锁更好的使用体验,本篇先给大家讲解六大升级中的三大升级内 ...

  8. Mac OS使用技巧之十六:系统失去响应怎么办?

    再好的系统,再快的本本,也会在运行时因为种种原因出现卡顿或者死机等失去响应的情况.Mac用户也会时不时碰到这种情况,最常见的表现为鼠标变为七彩圆圈,通常等上一会儿系统会自己恢复.如果迟迟没有响应的话, ...

  9. 信号与系统 chapter11 LTI系统的响应

    我发现好多人都喜欢写"LTI连续系统",殊不知LTI的全称就是LinearTimeInvariantSystemsLinear Time Invariant SystemsLine ...

最新文章

  1. vue init深度定制团队自己的Vue template
  2. Linux lvs 多端口组成
  3. Hive Join Strategies hive的连接策略
  4. c await和java_blog/java/test/awaitility.zh.md at master · c-rainstorm/blog · GitHub
  5. hdu5468 Puzzled Elena
  6. 初解禁:SDK服务端主程序入口函数SDK服务端主程序入口函数
  7. 魅族17 5G旗舰快充头曝光:万年24W终成过去时
  8. 标量、向量、矩阵、张量
  9. Android 设置 横屏 竖屏
  10. 再学 GDI+[20]: TGPTextureBrush 与 TWrapMode
  11. vue项目中使用axios发送请求
  12. p2p网络中的NAT穿透
  13. 网易暴力裁员事件 网易员工疑遭网易暴力裁员
  14. 7.JUC 三大辅助类
  15. cad二开之不通过netload加载命令(bundle文件的使用)
  16. 控制台报错: Another version of Vue Devtools seems to be installed. Please enable only one version at a ti
  17. html小总结:表格立体效果的实现.
  18. 支持 Docker 运行的 ChatGPT 平替之 Alpaca-Turbo (羊驼)
  19. 网页设计配色应用实例剖析——黄色系
  20. 不可忽视的UPS电源电池除尘

热门文章

  1. HDU-3338 Kakuro Extension
  2. JAVA练习49-爬楼梯
  3. 2022年信息学部物联网工程学院学生科协第二次网页大培训
  4. [软件更新]Flash Builder 4和Flash Catalyst的Beta2下载(新增大米盘下载)
  5. 搭建web服务器,创建基于域名的虚拟主机
  6. html新年拜年网页,新鸿儒HTML5花样拜年 20万人捧场闹新春
  7. 2020清华大学计算机复试线,2020清华大学考研分数线 复试录取分数是多少
  8. arduino 控制无刷电机_用Arduino控制无刷电机电调的最简方法
  9. 解放数据收集,众大云插件来袭!
  10. 使用步进电机和Android App的蓝牙控制迷你升降机