用“逐步排除”的方法定位Java服务线上“系统性”故障
说明:原文地址已经不可访问,其他地方有转载,不过很多丢失图片,所以,找到一处有图的重新配好图。
用“逐步排除”的方法定位Java服务线上“系统性”故障
李斯宁(高级测试开发工程师)
一、摘要
二、导言
三、本方法适用的范围
四、有哪些异常现象
- Java堆满
Java堆是“Java虚拟机”从操作系统申请到的一大块内存,用于存放Java程序运行中创建的对象。当Java堆满或者较满的情况下,会触发“Java虚拟机”的“垃圾收集”操作,将所有“不可达对象”(即程序逻辑不能引用到的对象)清理掉。有时,由于程序逻辑或者Java堆参数设置的问题,会导致“可达对象”(即程序逻辑可以引用到的对象)占满了Java堆。这时,Java虚拟机就会无休止地做“垃圾回收”操作,使得整个Java程序会进入卡死状态。我们可以使用jstat工具查看Java堆的占用率。 - 日志中的异常
目标服务可能会在日志中记录一些异常信息,例如超时、操作失败等信息,其中可能含有系统故障的关键信息。 - 疑难杂症
死锁、死循环、数据结构异常(过大或者被破坏)、集中等待外部服务回应等现象。这些异常现象通常采用jstack工具可以获取到非常有用的线索。
五、故障定位的步骤
第一步:排除其它程序占用过量系统资源的情况
- 系统提供的调用栈的转储工具【pstack】,可以了解到程序中各个线程当前正在干什么,从而了解到什么逻辑占用了CPU、什么逻辑占用了磁盘等
- 系统提供的调用跟踪工具【strace】,可以侦测到程序中每个系统API调用的参数、返回值、调用时间等。从而确认程序与系统API交互是否正常等。
- 系统提供的调试器【gdb】,可以设置条件断点侦测某个系统函数调用的时候调用栈是什么样的。从而了解到什么逻辑不断在分配内存、什么逻辑不断在创建新连接等
第二步:排除目标服务占用了过量系统资源的情况
- 如果CPU使用分散到多个线程,而且每个线程占用都不算高(例如都<30%),则排除CPU占用过高的问题
- 如果CPU使用集中到一个或几个线程,而且很高(例如都>95%),则用【jstack pid > jstack.log】获取目标服务中线程调用栈的情况。top中看到的占用CPU较高的线程的PID转换成16进制(字母用小写),然后在jstack.log中找到对应线程,检查其逻辑:
- 假如对应线程是纯计算型任务(例如GC、正则匹配、数值计算等),则排除CPU占用过高的问题。当然如果这种线程占用CPU总量如果过多(例如占满了所有核),则需要对线程数量做控制(限制线程数 < CPU核数)。
- 假如对应线程不是纯计算型任务(例如只是向其他服务请求一些数据,然后简单组合一下返回给用户等),而该线程CPU占用过高(>95%),则可能发生了异常。例如:死循环、数据结构过大等问题,确定具体原因的方法见下文“第三步:目标进程内部观察”。
第三步:目标服务内部观察
- 检查jstack.log中是否有deadlock报出,如果没有则排除deadlock情况。
Found one Java-level deadlock:=============================“Thread-0″:waiting to lock monitor 0x1884337c (object 0x046ac698, a java.lang.Object),which is held by “main”“main”:waiting to lock monitor 0x188426e4 (object 0x046ac6a0, a java.lang.Object),which is held by “Thread-0″Java stack information for the threads listed above:===================================================“Thread-0″:at LockProblem$T2.run(LockProblem.java:14)- waiting to lock <0x046ac698> (a java.lang.Object)- locked <0x046ac6a0> (a java.lang.Object)“main”:at LockProblem.main(LockProblem.java:25)- waiting to lock <0x046ac6a0> (a java.lang.Object)- locked <0x046ac698> (a java.lang.Object)Found 1 deadlock.
- 用【POST http://www.xinitek.com/ajax/summaryJStack < jstack.log > jstack.log.summary】对jstack.log做合并处理,然后继续分析故障所在。
情况 | 嫌疑点 | 猜测原因 |
线程数量过多 | 某种线程数量过多 | 运行环境中“限制线程数量”的机制失效 |
多个线程在等待一把锁,但拿到锁的线程在做某个操作 | 拿到这把锁的线程在做网络connect操作 | 被connect的服务异常 |
拿到锁的线程在做数据结构遍历操作 | 该数据结构过大或被破坏 | |
某个耗时的操作被反复调用 | 某个应当被缓存的对象多次被创建 | 对象池的配置错误 |
等待外部服务的响应 | 很多线程都在等待外部服务的响应 | 该外部服务故障 |
很多线程都在等待FutureTask完成,而FutureTask在等待外部服务的响应 | 该外部服务故障 |
1000 threads at“Timer-0″ prio=6 tid=0x189e3800 nid=0x34e0 in Object.wait() [0x18c2f000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)at java.util.TimerThread.mainLoop(Timer.java:552)- locked [***] (a java.util.TaskQueue)at java.util.TimerThread.run(Timer.java:505)
38 threads at“Thread-44″ prio=6 tid=0×18981800 nid=0x3a08 waiting for monitor entry [0x1a85f000]java.lang.Thread.State: BLOCKED (on object monitor)at SlowAction$Users.run(SlowAction.java:15)- waiting to lock [***] (a java.lang.Object)
1 threads at“Thread-3″ prio=6 tid=0x1894f400 nid=0×3954 runnable [0x18d1f000]java.lang.Thread.State: RUNNABLEat java.util.LinkedList.indexOf(LinkedList.java:603)at java.util.LinkedList.contains(LinkedList.java:315)at SlowAction$Users.run(SlowAction.java:18)- locked [***] (a java.lang.Object)
“Thread-0″ prio=6 tid=0x189cdc00 nid=0×2904 runnable [0x18d5f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
…
at RequestingService$RPCThread.run(RequestingService.java:24)
“pool-1-thread-1″ prio=6 tid=0x188fc000 nid=0×2834 runnable [0x1d71f000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
…
at IndirectWait.request(IndirectWait.java:23)
at IndirectWait$MyThread$1.call(IndirectWait.java:46)
at IndirectWait$MyThread$1.call(IndirectWait.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
六、给运维人员的简单步骤
用“逐步排除”的方法定位Java服务线上“系统性”故障相关推荐
- 【线上问题】线上故障分析-故障分级,原因,分类,混沌工程,排除方法
参考资料 因为一行Log日志导致的线上P1事故_xiangzhihong8的博客-CSDN博客 线上故障分析-故障分级,原因,分类,混沌工程,排除方法_架构_Ybb_studyRecord-DevPr ...
- MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题.线上排查.性能优化等内容是面试过程中的"常客",而对于线上遇到的"疑难杂症 ...
- Java线上应用故障排查之二:高内存占用
前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查. 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGe ...
- Java线上应用故障排查之一:高内存占用
Java线上应用故障排查之一:高内存占用 转载地址:http://www.blogjava.net/hankchen 搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMe ...
- 微服务治理-含服务线上稳定性保障建设治理
微服务的概念 任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致. -- 康威定律 微服务是一种研发模式.换句话理解上面这句康威定律,就是说 一旦企业决 ...
- 基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署
基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA政府采购线上招投标平台计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...
- java毕业设计线上教学平台mybatis+源码+调试部署+系统+数据库+lw
java毕业设计线上教学平台mybatis+源码+调试部署+系统+数据库+lw java毕业设计线上教学平台mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B/S架构 开 ...
- java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw
java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw java毕业设计线上办公工作流系统mybatis+源码+调试部署+系统+数据库+lw 本源码技术栈: 项目架构:B ...
- java毕业设计线上甜品店售卖系统Mybatis+系统+数据库+调试部署
java毕业设计线上甜品店售卖系统Mybatis+系统+数据库+调试部署 java毕业设计线上甜品店售卖系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语言:Ja ...
最新文章
- 又爱又恨的 Microsoft Edge!
- 面试必备,各种技术知识集大成之项目~
- python绘制随机数直方图-用matplotlib画直方图(histogram)
- Java 8日期时间API教程:LocalDateTime
- 【OS学习笔记】十九 保护模式六:保户模式下操作系统内核如何加载用户程序并运行
- c#获取文件夹路径(转载)
- ES6/04/严格模式,开启严格模式,严格模式与普通模式对比发生了那些变化,高阶函数,闭包函数,递归函数,递归实例(1,阶乘,2,斐波那契数列,3,根据id返回对应数据对象),浅拷贝和深拷贝
- arma matlab函数,MATLAB中ARMA模型预测差分问题
- JD_Source Code for problem 1581
- linux操作命令之压缩命令
- python中md5方法返回值_python中的md5加密
- 网页无法正常显示Lato字体,绕路而行
- (二)计算软件的安装:truegrid、ls-prepost、ls-dyna
- STM32智能小车电路综合实习报告
- mysql中哪一个储存逻辑型_《VisualFoxPro》2018秋华东年季学期在线作业(一)二三...
- 微星笔记本每次都进bios
- 矢量网络分析仪(Vector Network Analyzer)
- bin文件转换成hex的方法
- [CISCN]2020
- 敏捷下的scrim、xp、3355、TDD、BDD、CI、DI及四个仪式、十二原则汇总