java线上故障排查套路总结

news2025/2/2 15:52:10

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。

文章目录

  • CPU 篇
    • 查看实时线程堆栈信息
    • 对jstack文件进行分析
    • 频繁GC
    • 上下文切换
  • 内存篇
    • 如何分析Dump文件内容
    • youngGC 过于频繁
    • youngGC 耗时过长
  • 磁盘篇
  • 网络篇
    • netstat
  • 附录
    • jstack 线程快照
    • jstat 虚拟机运行时统计
    • jmap内存快照
    • jinfo 虚拟机配置参数
    • netstat
    • 文本分析命令

CPU 篇

原因包括:业务逻辑问题(一般是死循环)、频繁gc以及上下文切换过多,可使用jstack分析线程对应的堆栈情况

查看实时线程堆栈信息

  1. top命令查找cpu使用率较高的进程
  2. 接着用 top -Hp pid 找到cpu使用率较高的线程
  3. printf '%x\n' pid 转换为nid
  4. 使用 jstack pid | grep 'nid' -A10 --color 找到对应的堆栈信息 (pid为进程pid)

(参考)


最佳实践步骤

# 先将线程占用快照信息输出到快照文件
top -H -n 1 -p 17810 > 17810.jstack
# 再将jstack信息也保存到快照文件
jstack -l 17810 >> 17810.jstack
# 然后进行分析
printf '%x\n' 18124
cat 17810.jstack | grep '46cc' -A20 --color

对jstack文件进行分析

通常我们更专注 WATING 和TIMED_WATING 的线程,BLOCKED更不用多说了

  1. 将jstack信息输出到log文件中 jstack -l pid >> pid.jstack.log
  2. cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c

对jstack状态有一个整体的把握,如果WAITING之类的特别多,多半有问题

  1. cat jstack.log | grep -i -E 'BLOCKED | deadlock'

观察处于BOLCKED状态的线程数量,以及死锁信息


频繁GC

jstat -gc pid 1000 对gc分代变化情况进行观察,1000表示采样间隔(ms)

S0C/S1CS0U/S1UEC/EUOC/OUMC/MU
S0/S1 容量(kb)S0/S1 使用量(kb)Eden区容量/使用量(kb)老年代容量/使用量(kb)元数据区容量/使用量(kb)

次数代表从应用程序启动到采样时的次数

YGC/YGTFGC/FGCTGCT
YoungGC 次数/耗时(s)FullGC 次数/耗时(s)总耗时(s)

上下文切换

vmstat pid 命令 cs(context switch) 代表上下文切换次数

pidstat -w pid 命令 cswch 自愿切换/nvcswch 非自愿切换


内存篇

导出dump文件 jmap -dump:format=b,file=filename.hprof pid, 分析工具可使用 通过mat(Eclipse Memory Analysis Tools)导入dump文件进行分析 、jprofiler

如何分析Dump文件内容

分析dump文件,可以使用idea简单分析,比较方便实用,得到dump文件后
在这里插入图片描述
通过Run -> OpenProfiler Snapshot -> Open 路径打开 dump文件,例如 xxxx.hprof
打开后可以看到内存快照中哪些对象数量过多,占用内存大小等信息,
在这里插入图片描述
这里我们选中左侧byte[] 双击,看到如下内容
在这里插入图片描述
关注GC root 信息,大致就能直接定位到源码位置所在,也就大致分析出来问题故障点,当然实用JProfiler可以得到更加详细的信息,故障点位置等,这里不展开,可以评论区讨论
在这里插入图片描述

youngGC 过于频繁

短周期小对象过多,考虑Eden区/新生代是否设置过小,调整 -Xmn、-XX:SurvivorRatio ,频率仍然高,可以分析dump文件

youngGC 耗时过长

G1日志、jinfo


磁盘篇

df -hl 查看文件系统状态

磁盘性能分析通过 iostatiostat -d -k -x,最后一列%util可以看到每块磁盘写入的程度,而rrqpm/s以及wrqm/s分别表示读写速度,一般就能帮助定位到具体哪块磁盘出现问题

iotop命令来进行定位文件读写的来源,不过这边拿到的是tid,我们要转换成pid,可以通过readlink来找到pidreadlink -f /proc/*/task/tid/…/…


网络篇

netstat

netstat -tlnp查看系统中的TCP连接监听地址、端口以及进程等信息

查看端口8080被哪个进程占用:netstat -tlpn | grep :8080

查看进程1000使用了哪些tcp端口:netstat -tlpn | grep 1000

netstat -tn | grep -v ESTABLISHED查看系统中的非正常连接

附录

jstack 线程快照

jstack是Java开发工具包(JDK)中的一个命令行工具,用于生成Java虚拟机(JVM)当前时刻的线程快照(Thread Dump)。线程快照可以用于分析和调试Java应用程序中的线程问题,如死锁、线程等待等。

jstack命令的常见参数如下:

  1. -l:除了打印线程堆栈信息外,还会额外打印关于锁的附加信息,如拥有该锁的线程等待的条件。

  2. -F:当正常情况下无法获得线程快照时,强制生成线程快照。这通常在JVM处于死锁或长时间无响应状态时使用。

  3. -m:除了打印线程堆栈信息外,还会打印与线程关联的本地方法堆栈信息。

  4. -h-help:打印jstack命令的帮助信息,包括所有可用的参数和选项。

常见的jstack用法如下:

  1. 打印Java进程的线程快照:

    jstack <pid>
    

    <pid>是Java进程的进程ID。

  2. 打印Java进程的线程快照,并将结果保存到文件中:

    jstack <pid> > thread_dump.txt
    

    将线程快照输出重定向到文件thread_dump.txt中,以便后续分析和查看。

  3. 使用特定的参数生成线程快照:

    jstack -l -F <pid>
    

    这个命令将生成带有附加锁信息的强制线程快照。

  4. 生成线程快照并指定输出到标准错误流(stderr):

    jstack -l <pid> 2> error.log
    

    这个命令将线程快照输出到标准错误流,并将其重定向到文件error.log中。

  5. 使用jstack命令连接到远程Java进程并生成线程快照:

    jstack -l <hostname>:<port>
    

    <hostname>是远程主机的名称或IP地址,<port>是远程Java进程的调试端口。

jstack命令是诊断Java应用程序中线程问题的有用工具,可用于定位性能问题、死锁和线程等待等情况。通过分析线程快照,可以获得关于线程状态、锁的信息以及线程之间的相互关系,帮助开发人员进行故障排除和性能优化。

关于java.lang.Thread.State

要根据jstack命令输出的内容中的java.lang.Thread.State来判断系统的总体运行情况,可以关注线程的状态并进行分析。java.lang.Thread.State表示线程的状态,可以提供有关线程活动和阻塞的信息。以下是一些常见的线程状态和它们的含义:

  1. RUNNABLE(可运行状态):线程正在执行,或者等待CPU资源执行。

  2. BLOCKED(阻塞状态):线程正在等待获取锁,而其他线程已经持有了该锁。

  3. WAITING(等待状态):线程正在等待另一个线程发出特定信号,直到其他线程通知它继续执行。

  4. TIMED_WAITING(计时等待状态):线程正在等待一段时间,直到超时或者其他线程通知它继续执行。

  5. TERMINATED(终止状态):线程已经执行完毕或者因为异常等原因被终止。

通过观察jstack命令输出中各个线程的状态,可以对系统的总体运行情况进行初步判断。下面是一些常见的判断场景:

  1. 如果大多数线程处于RUNNABLE状态,系统可能正常运行,并且没有明显的性能瓶颈。

  2. 如果有大量线程处于BLOCKED状态,系统可能存在严重的竞争条件或死锁情况。需要进一步分析具体的线程堆栈信息来解决问题。

  3. 如果有线程处于WAITINGTIMED_WAITING状态,可以根据线程等待的对象或条件来判断是否有资源争用或线程间通信的问题。

  4. 如果有线程处于TERMINATED状态,表示线程已经执行完毕,但可以进一步观察是否有异常抛出或其他异常情况发生。

需要注意的是,仅通过线程状态无法完全确定系统的总体运行情况,因为线程状态只是系统的一个方面。综合考虑线程状态、线程数量、CPU使用率、内存使用情况等信息可以更全面地评估系统的运行状况。在分析线程堆栈信息时,还应注意查看是否存在异常、死锁、阻塞等特定的线程问题,并进行相应的故障排除和性能优化。

jstat 虚拟机运行时统计

jstat是Java开发工具包(JDK)中的一个命令行工具,用于监视和收集Java虚拟机(JVM)的各种运行时统计信息。它可以提供有关堆内存、垃圾回收、类加载、线程和编译器等方面的数据,用于性能分析和故障排除。

jstat命令的常见参数如下:

  1. -class:打印类加载、卸载和总计的统计信息。

  2. -compiler:打印JIT编译器的统计信息,包括编译任务数量、编译耗时等。

  3. -gc:打印垃圾回收统计信息,包括堆内存使用情况、垃圾回收次数、回收时间等。

  4. -gccapacity:打印堆内存容量和使用情况的详细信息,包括新生代、老年代、持久代的容量、使用量和空闲量等。

  5. -gcutil:打印垃圾回收统计信息的摘要,包括垃圾回收器的使用率、堆内存的使用率等。

  6. -printcompilation:打印JIT编译器编译方法的详细信息,包括方法名称、编译状态、编译耗时等。

  7. -utilization:打印垃圾回收器的利用率,包括新生代、老年代、元数据区的利用率。

  8. -options:打印JVM的命令行选项和系统属性。

常见的jstat用法如下:

  1. 监视Java进程的类加载情况:

    jstat -class <pid> [interval] [count]
    

    <pid>是Java进程的进程ID,[interval]是采样间隔时间(以毫秒为单位,默认值为1000ms),[count]是采样次数(默认值为无限次)。

  2. 监视Java进程的垃圾回收统计信息:

    jstat -gc <pid> [interval] [count]
    

    <pid>是Java进程的进程ID,[interval]是采样间隔时间(以毫秒为单位,默认值为1000ms),[count]是采样次数(默认值为无限次)。

  3. 监视Java进程的堆内存容量和使用情况:

    jstat -gccapacity <pid> [interval] [count]
    

    <pid>是Java进程的进程ID,[interval]是采样间隔时间(以毫秒为单位,默认值为1000ms),[count]是采样次数(默认值为无限次)。

  4. 监视Java进程的JIT编译器统计信息:

    jstat -compiler <pid> [interval
    

jmap内存快照

jmap是Java开发工具包(JDK)中的一个命令行工具,用于生成Java进程的内存映像和堆转储快照。它可以用于分析Java应用程序的内存使用情况、查找内存泄漏和性能问题等。

jmap命令的常见参数如下:

  1. -heap:打印Java进程的堆内存使用情况,包括堆的大小、使用量、垃圾回收器的详细信息等。

  2. -histo:打印Java进程的堆内存中对象的统计信息,包括对象类型、数量和占用内存大小等。

  3. -dump:<dump-options>:生成Java进程的堆转储快照(Heap Dump),可以用于分析内存泄漏和对象分布等。<dump-options>可以是以下选项之一:

    • live:只转储活动对象(默认选项)。
    • all:转储所有对象,包括活动对象和垃圾对象。
    • file=<filename.hprof>:将堆转储快照保存到指定的文件中。
    • format=<format>:指定堆转储快照的格式,可以是b(二进制格式)或h(文本格式,默认值)。
  4. -finalizerinfo:打印等待终结的对象的信息,包括等待终结队列的长度和具体对象的信息。

  5. -permstat:打印永久代(PermGen/Metaspace)的统计信息,包括类加载器、类和字符串的数量和占用内存大小等。

常见的jmap用法示例如下:

  1. 打印Java进程的堆内存使用情况:

    jmap -heap <pid>
    

    <pid>是Java进程的进程ID。

  2. 打印Java进程的堆内存中对象的统计信息:

    jmap -histo <pid>
    

    <pid>是Java进程的进程ID。

  3. 生成Java进程的堆转储快照,并保存到文件中:

    jmap -dump:file=<filename> <pid>
    

    <filename>是要保存堆转储快照的文件名,<pid>是Java进程的进程ID。

  4. 打印等待终结的对象的信息:

    jmap -finalizerinfo <pid>
    

    <pid>是Java进程的进程ID。

  5. 打印永久代(PermGen/Metaspace)的统计信息:

    jmap -permstat <pid>
    

    <pid>是Java进程的进程ID。

jmap命令是一个强大的工具,可以帮助开发人员分析Java应用程序的内存使用情况和性能问题。通过使用不同的参数组合,可以获取有关堆内存、对象统计、堆转储等方面的详细信息。请注意,在使用jmap命令时,建议谨慎使用并避免在生产环境中使用,以避免对应用程序性能产生负面影响。

jinfo 虚拟机配置参数

jinfo是Java开发工具包(JDK)中的一个命令行工具,用于查看和调整Java进程的Java虚拟机(JVM)配置参数和系统属性。它可以帮助开发人员获取Java进程的运行时信息,并对其进行动态调整。

jinfo命令的常见参数如下:

  1. -flag <name>:打印指定JVM参数的当前值和默认值。

  2. -flags:打印Java进程的所有JVM参数和系统属性。

  3. -sysprops:打印Java进程的所有系统属性。

  4. -h-help:打印jinfo命令的帮助信息,包括所有可用的参数和选项。

常见的jinfo用法示例如下:

  1. 打印Java进程的指定JVM参数的当前值和默认值:

    jinfo -flag <name> <pid>
    

    <name>是要打印的JVM参数的名称,<pid>是Java进程的进程ID。

  2. 打印Java进程的所有JVM参数和系统属性:

    jinfo -flags <pid>
    

    <pid>是Java进程的进程ID。

  3. 打印Java进程的所有系统属性:

    jinfo -sysprops <pid>
    

    <pid>是Java进程的进程ID。

jinfo命令可以帮助开发人员获取Java进程的运行时信息,如JVM参数和系统属性的值。通过查看这些信息,可以了解Java进程的配置和环境,帮助进行故障排除和性能优化。此外,jinfo还可以用于动态调整JVM参数的值,但在使用时需要谨慎,避免对应用程序产生不可预知的影响。

netstat

netstat命令的一些常见用法示例,以帮助排查端口被哪个进程占用等相关信息:

  1. 显示所有活动连接和监听端口:

    netstat -a
    
  2. 仅显示TCP连接:

    netstat -at
    
  3. 仅显示UDP连接:

    netstat -au
    
  4. 显示与网络连接关联的进程/程序:

    netstat -ap
    
  5. 显示正在监听的TCP端口:

    netstat -ltn
    
  6. 显示正在监听的UDP端口:

    netstat -lun
    
  7. 显示与指定端口相关的进程/程序:

    netstat -tulpn | grep <端口号>
    

    例如,要查找占用端口80的进程,可以使用:

    netstat -tulpn | grep :80
    
  8. 显示网络统计信息和摘要:

    netstat -s
    
  9. 显示路由表信息:

    netstat -r
    

这些示例将帮助快速了解网络连接状态、监听端口和相关进程的信息。请注意,有些示例可能需要root或管理员权限才能显示完整的信息。

netstat命令还有其他参数和选项可用于更精细的控制和筛选输出。可以通过man netstat命令在终端上查看完整的netstat命令手册以获取更多详细信息

文本分析命令

cat info.log | awk -F '(回调类型EventType=|,callbackMsg)' '{print $2}' | sort | uniq -c | sort -nr

从名为 info.log 的文件中读取内容,使用 awk 命令将每行按照指定的字段分隔符提取出第二个字段,然后对提取的字段进行排序,统计每个字段出现的次数,并按照次数进行逆序排列。

cat 将文本文件内容输出到标准输出

awk是一种文本处理工具,它可以按行扫描和处理文件。

-F '(回调类型EventType=|,callbackMsg)'用于指定字段分隔符,这里是使用正则表达式作为分隔符,表示字段可以通过字符串 “回调类型EventType=” 或 “,callbackMsg” 来分隔。

'{print $2}'是一个 AWK 脚本,表示打印每行中的第二个字段。

uniq -c 用于去除重复的行,保留唯一的行 -c 用于计数并显示美航出现的次数

sort -nr 按照数值降序,从大到小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(五)Flask之深入剖析路由源码

路由&#xff08;Route&#xff09;这个概念在所有web框架中都非常重要&#xff0c;它是用于定义URL和对应的处理函数&#xff08;视图&#xff09;之间的映射关系。通过定义路由&#xff0c;可以使web框架应用程序能够响应不同的URL请求&#xff0c;并执行相应的逻辑。 源码剖…

老码农的管理拙见

【引子】 尽管自己从业了20多年&#xff0c;也曾管理过从几个人到几百人的团队&#xff0c;但个人非常不愿意或者不敢讨论团队管理的问题&#xff0c;因为管理是以结果为导向的&#xff0c; 具有后验的特征&#xff0c;而且管理中面对的最大复杂性是人&#xff0c;每个人都是不…

安装pycocotools报错“fatal error: Python.h: No such file or directory“ | 已解决

记录一段报错&#xff1a; pycocotools/_mask.c:6:10: fatal error: Python.h: No such file or directory#include "Python.h"^~~~~~~~~~compilation terminated./tmp/pip-build-env-crtws8v6/overlay/lib/python3.8/site-packages/Cython/Compiler/Main.py:369: F…

mssql 以xml类型为存储过程传递不确定数量的参数

mssql 以xml类型传递不确定数量的参数 存储过程xml 处理在存储过程中参数在存储过程中使用 xml 作为参数存储过程 相信各位小伙伴在使用数据库的过程中,或多或少的建立了一些存储过程,并且带有一些参数,用来增加存储过程的适用性。 类似老顾的截图这样的,通常,我们需要将…

华为云CodeArts Check IDE插件体验之旅

1 开发者的思考 近年来&#xff0c;ChatGPT的来临像一场突然出现的风暴&#xff0c;程序员是否马上被取代的担忧出现在媒体上了&#xff0c;作为软件开发小白&#xff0c;前不久我也陷入了这样的深思之中&#xff0c;但认真的想了下&#xff0c;ChatGPT就如自动驾驶一样&#…

MySQL的安装与配置

今天要和大家唠唠关于数据库的那些事儿&#xff01;按照加哥一贯的调性&#xff0c;咱还是从花边八卦聊起。先来简 单地梳理一下数据库、MySQL发展的时间线&#xff1a; 1970年&#xff0c;在IBM公司工作的数学家 E.F.Codd 发表了数学论文《大型共享数据库的关系数据模型》 &am…

每日站会如此简单,为什么总是开不好?

美式足球或橄榄球等运动的球队&#xff0c;会在每场比赛上场前聚在一起开个短会。这种临场短会能让整个球队的成员在比赛过程中互通信息、相互协作。 每日站会是敏捷开发的重要流程之一。对于团队而言&#xff0c;每日站会与这种赛前短会类似&#xff0c;让每个成员都了解到团…

2023年上海/成都/深圳CSPM-3中级国标项目管理认证招生

CSPM-3中级项目管理专业人员认证&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才职业能力评价和激励机制的要…

Matplotlib坐标轴范围

Matplotlib 可以根据自变量与因变量的取值范围&#xff0c;自动设置 x 轴与 y 轴的数值大小。当然&#xff0c;您也可以用自定义的方式&#xff0c;通过 set_xlim() 和 set_ylim() 对 x、y 轴的数值范围进行设置。 当对 3D 图像进行设置的时&#xff0c;会增加一个 z 轴&#x…

日志收集工具

日志管理的第一步是收集日志数据。日志收集可能是一项具有挑战性的任务&#xff0c;因为某些系统&#xff08;如防火墙、入侵检测系统和入侵防御系统&#xff09;具有生成大量日志数据的 EPS&#xff08;每秒事件数&#xff09;。为了实时收集和处理日志数据&#xff0c;无论日…

【历史上的今天】6 月 7 日:图灵逝世;Kubernetes 开源版本发布;分组交换网络发明者出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 7 日&#xff0c;在 1742 年的今天&#xff0c;普鲁士数学家克里斯蒂安哥德巴赫在写给瑞士数学家莱昂哈德欧拉的通信中&#xff0c;提出了以下的猜想&…

手机APP三维建模不清晰?单反相机接入移动端来袭!

为什么我们需要单反相机接入 当前&#xff0c;手机本身的像素还满足不了考古级的精度要求&#xff0c;考古现场都是用专业相机对文物进行拍照&#xff0c;再把照片导入到电脑进行建模。“考古工作比较细致&#xff0c;有时候一来一回挺费事的。”云端地球的忠实用户&#xff0…

Linux5.16 Ceph集群

文章目录 计算机系统5G云计算第四章 LINUX Ceph集群一、Ceph1.存储基础1&#xff09;单机存储设备2&#xff09;单机存储的问题3&#xff09;商业存储解决方案4&#xff09;分布式存储&#xff08;软件定义的存储 SDS&#xff09;5&#xff09;分布式存储的类型 2.Ceph 简介3.C…

微信公众号登录

整个流程&#xff0c;1.前端调用授权url 接口(创建一个重定向的请求方法&#xff0c;访问自动回调方法wechat.mp.callbackUrl的地址)。2.微信自动回调方法里判断该用户是需要注册还是直接登录(如果直接登录就返回token&#xff09; 是注册还是登录返回到配置文件中的 wechat.mp…

LIMS系统应用于第三方实验室的意义

金现代LIMS实验室管理系统是将实验室业务从线下转到线上&#xff0c;按照 CNAS 规范进行合规化管理&#xff0c;并提升实验室工作效率的信息化系统。随着实验室业务的不断发展&#xff0c;实验室的规模逐渐扩大&#xff0c;样品数量和检测项目不断增加&#xff0c;数据管理需求…

客户报备小程序系统开发制作方案

客户报备系统小程序是一种用于公司业务人员进行客户管理和报备的小程序系统。 客户报备小程序系统主要功能包括以下几个方面&#xff1a; 1、用户注册与登录 提供用户注册和登录功能&#xff0c;确保用户可以使用个人账户登录系统。 2、报备信息录入 对于需要报备的客户&#x…

手把手教你搭建SpringCloud项目(三)集成Eureka服务注册中心

我们首先了解 Eureka&#xff1a;官方介绍 一、了解Eureka 1、什么是服务治理&#xff1f; Springcloud 封装了Netfix公司开发的Eureka模块来实现服务治理。在传统的RPC远程调用中&#xff0c;管理每个服务于服务之间依赖关系复杂&#xff0c;管理复杂&#xff0c;所以需要使…

113. 路径总和 II

113. 路径总和 II 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 113. 路径总和 II https://leetcode.cn/problems/path-sum-ii/ 完成情况&#xff1a; 解题思路&#xff1a; /**解题思路&#xff1a;* 和之前一…

msys2安装与配置: 在windows上使用linux工具链g++和包管理工具pacman C++开发

文章目录 为什么用这个msys2下载、doc安装&#xff0c;很简单初次运行&#xff0c;做些配置更新软件安装与卸载方法安装必要的软件包设置win环境变量在windows terminal中使用在vscode中使用 为什么用这个msys2 方便windows上的C开发demo&#xff0c;不需要VS了方便C开发安装o…

Redis缓存更新策略以及常见缓存问题

文章目录 一、什么是缓存&#xff1f;二、添加Redis缓存三、缓存更新策略四、缓存穿透五、缓存雪崩六、缓存击穿七、缓存工具封装 一、什么是缓存&#xff1f; 缓存就是数据交换的缓冲区(Cache)&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较好&#xff0c;常见…