点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复。

1、排查思路

简单分析下可能出问题的地方,分为5个方向:

  • 系统本身代码问题

  • 内部下游系统的问题导致的雪崩效应

  • 上游系统调用量突增

  • http请求第三方的问题

  • 机器本身的问题

2、开始排查

  1. 查看日志,没有发现集中的错误日志,初步排除代码逻辑处理错误。

  2. 首先联系了内部下游系统观察了他们的监控,发现一起正常。可以排除下游系统故障对我们的影响。

  3. 查看provider接口的调用量,对比7天没有突增,排除业务方调用量的问题。

  4. 查看tcp监控,TCP状态正常,可以排除是http请求第三方超时带来的问题。

  5. 查看机器监控,6台机器cpu都在上升,每个机器情况一样。排除机器故障问题。即通过上述方法没有直接定位到问题。

3、解决方案

1、重启了6台中问题比较严重的5台机器,先恢复业务。保留一台现场,用来分析问题。

2、查看当前的tomcat线程pid。

3、查看该pid下线程对应的系统占用情况。top -Hp 384

4、发现pid 4430 4431 4432 4433 线程分别占用了约40%的cpu

5、将这几个pid转为16进制,分别为114e 114f 1150 1151

6、下载当前的java线程栈 sudo -u tomcat jstack -l 384>/1.txt

7、查询5中对应的线程情况,发现都是gc线程导致的

8、dump java堆数据

sudo -u tomcat jmap -dump:live,format=b,file=/dump201612271310.dat 384

9、使用MAT加载堆文件,可以看到javax.crypto.JceSecurity对象占用了95%的内存空间,初步定位到问题。

MAT下载地址:

http://www.eclipse.org/mat/

10、查看类的引用树,看到BouncyCastleProvider对象持有过多。即我们代码中对该对象的处理方式是错误的,定位到问题。

4、代码分析

我们代码中有一块是这样写的

这是加解密的功能,每次运行加解密都会new一个BouncyCastleProvider对象,放倒Cipher.getInstance()方法中。

看下Cipher.getInstance()的实现,这是jdk的底层代码实现,追踪到JceSecurity类中

verifyingProviders每次put后都会remove,verificationResults只会put,不会remove.

看到verificationResults是一个static的map,即属于JceSecurity类的。所以每次运行到加解密都会向这个map put一个对象,而这个map属于类的维度,所以不会被GC回收。这就导致了大量的new的对象不被回收。

5、代码改进

将有问题的对象置为static,每个类持有一个,不会多次新建。

6、本文总结

遇到线上问题不要慌,首先确认排查问题的思路:

  1. 查看日志

  2. 查看CPU情况

  3. 查看TCP情况

  4. 查看java线程,jstack

  5. 查看java堆,jmap

  6. 通过MAT分析堆文件,寻找无法被回收的对象

来源 | https://urlify.cn/Q3Ar6z

热门内容:
  • SpringBoot开发微信公众号

  • 拒绝接口裸奔!开放API接口签名验证!

  • 笑了,面试官问我知不知道异步编程的Future。

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

服务不可用怎么排查?讲了100遍还是记不住?相关推荐

  1. “服务不可用“怎么排查?

    下面是线上机器的cpu使用率,可以看到从4月8日开始,随着时间cpu使用率在逐步增高,最终使用率达到100%导致线上服务不可用,后面重启了机器后恢复. 1.排查思路 简单分析下可能出问题的地方,分为5 ...

  2. 【CTO讲堂】打造数据可靠、服务高可用的客服平台

    为了帮助IT从业者职业之路拥有更多收获,在诸多C粉的殷切期待下,由 CTO俱乐部打造的CTO线上讲堂自登场以来获得大家好评.本期邀请Udesk CTO肖立鹏带来"打造数据可靠.服务高可用的客 ...

  3. Druid获取连接超时,导致服务不可用

    前言 一个微服务模块在运行一段时间之后,整体服务就不可用了,但是服务却没有打印任何错误日志.而对服务进行重启之后,服务就可以暂时提供一段时间服务,过一段时间之后再次不可用. 分析 服务进行重启就可以正 ...

  4. 全面!一文理解微服务高可用的常用手段

    来自:高可用架构公众号 " 高可用并不是一套整体解决方案,而是由诸多环节组成,一环扣一环,鬼知道为了这些串联起来的环节,我得出多少张牌去应对,才能最终组成一个整个系统的高可用落地方案. 什么 ...

  5. ChaosBlade x SkyWalking 微服务高可用实践

    来源|阿里巴巴云原生公众号 前言 在分布式系统架构下,服务组件繁多且服务间的依赖错综复杂,很难评估单个故障对整个系统的影响,而且请求链路长,如果监控告警.日志记录等基础服务不完善会造成故障响应.故障定 ...

  6. 微服务高可用之熔断器实现原理与 Golang 实践

    I.内容提要 在微服务架构中,经常会碰到服务超时或通讯失败的问题,由于服务间层层依赖,很可能由于某个服务出现问题,不合理的重试和超时设置,导致问题层层传递引发雪崩现象,而限流和熔断是解决这个问题重要的 ...

  7. 全面 一文理解微服务高可用的常用手段

    " 高可用并不是一套整体解决方案,而是由诸多环节组成,一环扣一环,鬼知道为了这些串联起来的环节,我得出多少张牌去应对,才能最终组成一个整个系统的高可用落地方案. 图片来自 Pexels 什么 ...

  8. 微服务高可用利器——Hystrix熔断降级原理实践总结

    前言 最近在工作中参与组内服务稳定性建设,梳理我们目前服务现状并接入公司自研稳定性保障平台.对公司内自研组件以及业界流行的Hystrix做了学习,Netflix Hystrix 里面大量RxJava响 ...

  9. 查找计算机 域服务不可用,win7系统打印文件提示Active Directory域服务不可用解决方法...

    办公用户因为工作需要,就需要安装打印机,也是办公设备中不可缺少一部分,使用过程中难免遇到一些故障问题,Win7系统打印文件时频繁弹出提示"Active Directory域服务当前不可用&q ...

最新文章

  1. 如何从机器学习数据中获取更多收益
  2. [C#]无边框窗体缩放的虚线框怎么实现
  3. IBatis.Net学习笔记六--再谈查询
  4. 给插店一个成功案例给自己一次机会
  5. cocos2d-x初探学习笔记(1)--HelloWorld
  6. 蚂蚁森林快捷指令_iPhone「快捷指令」怎么玩?玩法太多,别让这个功能吃灰
  7. console 速查手册
  8. mysql nodejs 并发
  9. linux知识点查阅
  10. postgresql mysql数据类型_PostgreSQL和mysql数据类型对比兼容
  11. 【小记】-007--前端SEO优化
  12. 截获webView点击事件
  13. gitee和gitHub的命令和详细步骤操作
  14. 小米C++开发笔试真题
  15. Go --- html/template模板包的使用
  16. 有了这些好看的流程图模板,你也可以画出漂亮的流程图
  17. 暑假来了,画一个日月地球的轨道模型给孩子们,秒懂四季更迭、日蚀月蚀
  18. java vardump_Java内存查看与分析
  19. Google Groups 精彩推荐
  20. 关于DOCX XML

热门文章

  1. shell 中长命令的换行处理
  2. 大四狗找工作,持续更新
  3. 例4-1和例4-2和例4-3
  4. 利用OWC创建图表的完美解决方案
  5. spoolsv.exe占CPU100% 的解决方法
  6. Datawhale组队学习周报(第005周)
  7. 测试一下,你能小学毕业吗?
  8. 【Codeforces】808D Array Division(前后两部分和相等)
  9. 计算机在轻工行业中的应用,计算机在不同领域中的具体应用
  10. 用 Python 画圣诞树的 N 种玩法