Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >将java进程转移到“解剖台”之前,法医都干了什么?

将java进程转移到“解剖台”之前,法医都干了什么?

作者头像
xjjdog
发布于 2019-08-09 06:34:29
发布于 2019-08-09 06:34:29
85700
代码可运行
举报
文章被收录于专栏:架构专题架构专题
运行总次数:0
代码可运行
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

作为法医,不怕高度腐烂的尸体,也不怕错综复杂的案情。最怕的,是没留下任何东西。空无一物,任何高超的技术,丰富的经验,都无从下手。

生产环境错综复杂,几分钟前活蹦乱跳的进程,此刻就奄奄一息的躺在那里,苟延残喘。作为第一时间发现的目击者,一定要注意保存好现场。有时,最坏的情况就是引火上身,纠缠不清,这都是我们不愿看到的。 在进程的生命烟消云散之前,我们还有很多事要做。本篇文章,将介绍常用的保留线索方法。最后,将这个过程,使用Shell脚本自动化。

系统环境,不说谎的案发现场

1、系统当前网络连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ss -antp > $DUMP_DIR/ss.dump 2>&1

本命令将系统的所有网络连接输出到ss.dump文件中。使用ss命令而不是netstat的原因,是因为netstat在网络连接非常多的情况下,执行非常缓慢。

后续的处理,通过查看各种网络连接状态的梳理,来排查TIME_WAIT或者CLOSE_WAIT,或者其他连接过高的问题,非常有用。

2、网络状态统计

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netstat -s > $DUMP_DIR/netstat-s.dump 2>&1

将网络统计状态,输出到netstat-s.dump文件中。它能够按照各个协议进行统计输出,对把握当时整个网络状态,有非常大的作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sar -n DEV 1 2 > $DUMP_DIR/sar-traffic.dump 2>&1

上面这个命令,会使用sar输出当前的网络流量。在一些速度非常高的模块上,比如rediskafka,就经常发生跑满网卡的情况。

3、进程资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lsof -p $PID > $DUMP_DIR/lsof-$PID.dump

这是个非常强大的命令。可以查看进程打开了哪些文件,这是一个神器,可以以进程的维度查看整个资源的使用情况。这个命令在资源非常多的情况下,输出稍慢,耐心等待。

4、CPU资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mpstat > $DUMP_DIR/mpstat.dump 2>&1
vmstat 1 3 > $DUMP_DIR/vmstat.dump 2>&1
sar -p ALL  > $DUMP_DIR/sar-cpu.dump  2>&1
uptime > $DUMP_DIR/uptime.dump 2>&1

这几个命令,我们在《Linux之《荒岛余生》(二)CPU篇》这篇文章,已经有了比较详细的介绍。主要输出当前系统的CPU和负载,便于事后排查。

这几个命令的功能,有不少重合,使用者要注意甄别。

5、I/O资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
iostat -x > $DUMP_DIR/iostat.dump 2>&1

一般,以计算为主的服务节点,I/O资源会比较正常。但有时候也是会发生问题的,比如日志输出过多,或者磁盘问题等。此命令可以输出每块磁盘的基本性能信息,用来排查I/O问题。

6、内存问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
free -h > $DUMP_DIR/free.dump 2>&1

内存问题较为复杂,有兴趣可以看下xjjdog堆外内存排查小结这篇文章。一般发生的问题是JVM内存溢出,我们在进程小节说明。

free命令能够大体展现操作系统的内存概况,是故障排查中一个非常重要的点。

7、其他全局

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ps -ef > $DUMP_DIR/ps.dump 2>&1
dmesg > $DUMP_DIR/dmesg.dump 2>&1
sysctl -a > $DUMP_DIR/sysctl.dump 2>&1

在xjjdog的其他文章,我们不止一次说到dmesg。dmesg是许多静悄悄死掉的服务留下的最后一点线索。

当然,ps作为执行频率最高的一个命令,它当时的输出信息,也必然有一些可以参考的价值。

由于内核的配置参数,会对系统产生非常大的影响。所以我们也输出了一份。

进程快照,最后的遗言

1、jinfo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
${JDK_BIN}jinfo $PID > $DUMP_DIR/jinfo.dump 2>&1

此命令将输出java的基本进程信息。包括环境变量和参数配置。

2、gc信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
${JDK_BIN}jstat -gcutil $PID > $DUMP_DIR/jstat-gcutil.dump 2>&1
${JDK_BIN}jstat -gccapacity $PID > $DUMP_DIR/jstat-gccapacity.dump 2>&1

jstat将输出当前的gc信息。一般,能大体看出一个端倪,如果不能,将借助jmap进行分析。

3、堆信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
${JDK_BIN}jmap $PID > $DUMP_DIR/jmap.dump 2>&1
${JDK_BIN}jmap -heap $PID > $DUMP_DIR/jmap-heap.dump 2>&1
${JDK_BIN}jmap -histo $PID > $DUMP_DIR/jmap-histo.dump 2>&1
${JDK_BIN}jmap -dump:format=b,file=$DUMP_DIR/heap.bin $PID > /dev/null  2>&1

jmap将会得到当前java进程的dump信息。如上所示,其实最有用的就是第4个命令,但是前面三个能够让你初步对系统概况进行大体判断。

因为,第4个命令产生的文件,一般都非常的大。而且,需要下载下来,导入MAT这样的工具进行深入分析,才能获取结果。

4、执行栈

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
${JDK_BIN}jstack $PID > $DUMP_DIR/jstack.dump 2>&1

jstack将会获取当时的执行栈。一般都会多次取值,我们这里取一次即可。这些信息非常有用,能够还原你的java进程中线程情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
top -Hp $PID -b -n 1 -c >  $DUMP_DIR/top-$PID.dump 2>&1

为了能够得到更加精细的信息,我们使用top命令,来获取进程中所有线程的cpu信息。这样,就可以看到资源到底是耗费在什么地方。

5、高级替补

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kill -3 $PID

有时候,jstack并不能够运行。有很多原因,比如java进程几乎不响应了。我们会尝试向进程发送kill -3信号。这个信号是java进程享有的,将会打印jstack的trace信息到日志文件中。是jstack的一个替补方案。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcore -o $DUMP_DIR/core $PID

对于jmap无法执行的问题,也有替补,那就是GDB组件中的gcore。将会生成一个core文件。我们可以使用如下的命令去生成dump

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
${JDK_BIN}jhsdb jmap --exe ${JDK}java  --core $DUMP_DIR/core --binaryheap

瞬时态和历史态

xjjdog这里创建两个名词。瞬时态是指当时发生的,快照类型的元素;历史态是指按照频率抓取的,有固定监控项的资源变动图。

上面有很多信息,比如CPU,比如系统内存等,瞬时态的价值就不如历史态来的直观一些,因为它还存在一个基线问题。所以如果有监控系统一类的工具,将美好的多。

但对于lsof,heap等,这种没有时间序列概念的混杂信息,无法进入监控系统,产生有用价值,就只能够通过瞬时态进行分析。这种情况下,瞬时态的价值反而更大一些。

End

我已经把上面的过程,写成了一个shell脚本。你可以在github上找到它。点击左下角的查看原文,也能和它见面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://github.com/sayhiai/shell

但值得注意的是,分布式环境的故障原因,往往会出乎意料,你的这份单机证据,可能就只是一个表象。它没有说谎,但它背后的意义,往往对问题本质进行了错误的引导。


觉得不错?点个赞鼓励一下吧。

相关文章 Linux之《荒岛余生》(一)准备篇 Linux之《荒岛余生》(二)CPU篇 Linux之《荒岛余生》(三)内存篇 Linux之《荒岛余生》(四)I/O篇 Linux之《荒岛余生》(五)网络篇 Java堆外内存排查小结

更多精彩文章

这么多监控组件,总有一款适合你 “分库分表” ?选型和流程要慎重,否则会失控 使用Netty,我们到底在开发些什么? ”MySQL官方驱动“主从分离的神秘面纱 这可能是最中肯的Redis规范了 发布系统有那么难么? 也浅谈下分布式存储要点 希望一个数据同步,包治百病 如何使用postgis做一个高可用的附近的人服务? 那些需要自己开发的安全需求 WebSocket协议 8 问 JAVA多线程使用场景和注意事项简版 Kafka基础知识索引

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小姐姐味道 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线上java JVM问题排查
下面是一个老系统,代码写的有点问题导致出现这样一个JVM占比过高的问题,正常情况下也就是CPU负载不高的时候21:00左右的,也有30万,但是再多一点30几万就是阈值,就会出现堆积。
Java架构师必看
2021/07/13
1.4K0
前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
上一周我有幸观看了高级架构师李国讲师的直播,内容是关于 Java 内存问题排查和解决。
RendaZhang
2020/09/08
1.5K0
前京东陌陌高级架构师的直播笔记分享(Java 内存问题排查和解决:内存概览,内存问题出现的原因,问题代码,案例分析)
Java应用线上问题排查工具整理
Java应用的线上问题,总结起来大概分为几类:CPU占用高,内存溢出,执行结果不对。
编程随笔
2024/06/16
2560
Linux 实用运维脚本分享
#查看僵尸进程 ps -al | gawk '{print $2,$4}' | grep Z # 匹配电子邮件的地址 cat index.html | egrep -o "[A-Za-z0-9._]+@[A-Za-z0-9.]+\.[a-zA-Z]{2,4}" > ans.txt #匹配http URL cat index.html | egrep -o "http://[A-Za-z0-9.]+\.[a-zA-Z]{2,3}" > ans.txt #纯文本形式下载网页 lynx -dump w
杰哥的IT之旅
2022/09/02
6.9K0
Java 开发必须掌握的线上问题排查命令
作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查。由于在生产环境中,一般没办法debug(其实有些问题,debug也白扯。。。),所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情况等。
哲洛不闹
2018/09/14
7190
妙啊,这份问题排查工具清单!
是这样的,我前两天遇到一个问题,需要排查一下,有个排查需要使用到的命令我死活想不起来。
why技术
2021/07/15
5660
妙啊,这份问题排查工具清单!
给我1万字,也讲Java不清内存排查。1万不行来2万~.~
本篇文章是《Java内存故障?只是因为你不够帅!》 这篇文章的续篇。上篇侧重于理论,本篇侧重于实践。对于内存问题排查来说,搞理论的痛苦,搞实践的也痛苦,没有一片清净之地。
xjjdog
2020/08/12
6010
给我1万字,也讲Java不清内存排查。1万不行来2万~.~
spring boot 部署脚本
spring boot 采用 maven assemble 进行打包 tar.zip文件 tar -xvf boot.tar -C /usr/loca/software 解压到指定目录 在po.xml 加入plugin <plugin> <!-- NOTE: We don't need a groupId specification because the group is org.apache.maven.plugins ...which is
用户1499526
2019/07/15
6540
java线上服务问题排查总结
版权声明:本文为木偶人shaon原创文章,转载请注明原文地址,非常感谢。 https://blog.csdn.net/wh211212/article/details/84866727
shaonbean
2019/05/26
1.3K0
Java 服务遇到线上问题怎么办?这样排查很赞!
线上问题不同于开发期间的 bug,与运行时环境、压力、并发情况、具体的业务相关。对于线上的问题利用线上环境可用的工具,收集必要信息 对定位问题十分重要。
码农架构
2020/10/29
1.3K0
Java 服务遇到线上问题怎么办?这样排查很赞!
Java线上问题排查思路及Linux常用问题分析命令学习
之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令。 也可以帮助自己在以后的工作中快速的排查线上问题。
一枝花算不算浪漫
2018/12/25
1.3K0
一份超详细的 Java 问题排查工具单
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。
芋道源码
2019/10/29
5430
一份超详细的Java问题排查工具单
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。
lyb-geek
2018/11/23
5040
【JVM进阶之路】八:性能监控工具-命令行篇
在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。
三分恶
2021/04/09
1.2K0
【JVM进阶之路】八:性能监控工具-命令行篇
转载【阿里员工排查问题的工具清单,总有一款适合你】
这是一篇来源于阿里内部技术论坛的文章,原文在阿里内部获得一致好评。作者已经把这篇文章开放到云栖社区中供外网访问。文章内容做了部分删减,主要删减掉了其中只有阿里内部才能使用的工具的介绍,并删减掉部分只有通过阿里内网才能访问到的链接。
用户5640963
2019/07/26
4770
从CPU爆表问题排查谈Java性能监测之道
记一次Java线上服务器CPU过载问题的排查过程,详解排查过程中用到的Java性能监测工具:jvisualvm、jstack、jstat、jmap。
净地
2018/07/17
2K0
从CPU爆表问题排查谈Java性能监测之道
Java问题排查工具清单
平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。
Java团长
2019/05/14
4800
Java问题排查工具清单
java(10)-JVM性能监控和优化
GC监控是为了鉴别JVM是否在高效地执行GC,以及是否有必要进行额外的性能调优。基于以上信息,我们可以修改应用程序或者调整GC算法(GC优化)。
黄规速
2022/04/14
1.3K0
java(10)-JVM性能监控和优化
Java 程序该怎么优化?JDK命令篇
Java 作为编程语言中的战斗机,JDK 默认已经为我们提供了很多排查问题的工具,接下来就逐一认识认识。
一猿小讲
2020/03/25
6540
【收藏向】常用Java排错工具单
表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数。
老九君
2020/09/21
7270
【收藏向】常用Java排错工具单
相关推荐
线上java JVM问题排查
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验