java线上故障排查套路总结

线上故障主要会包括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 按照数值降序,从大到小

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

el-table实现表格动态新增/插入/删除 表格行&#xff0c;可编辑单元格 效果如下&#xff1a; 点击“新增一行”可以在表格最后新增一行&#xff0c;单元格内容可编辑 点击绿色按钮&#xff0c;可在指定行的后面插入一行 点击红色-按钮&#xff0c;可以删除指定行 原理&#…

【IM群发苹果日历】获取推送通知的设备标识符(Device Token)

苹果日历群发部署设置推送服务器推送服务器&#xff0c;用于向苹果日历应用的设备发送推送通知。推送服务器需要能够与Apple Push Notification Service (APNs) 进行通信。怎样来做&#xff1f; 部署设置推送服务器并与APNs进行通信需要以下步骤&#xff1a; 获取APNs证书&am…

Ubuntu下安装Miniconda

下载 到根据自己本地python版本到官网下载 https://docs.conda.io/en/latest/miniconda.html#linux-installers 我本地是python3.8 然后上传到Ubuntu服务器上&#xff0c;或者直接使用wget下载&#xff1a; wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5…

Go语言之函数补充defer语句,递归函数,章节练习

defer语句是go语言提供的一种用于注册延迟调用的机制&#xff0c;是go语言中一种很有用的特性。 defer语句注册了一个函数调用&#xff0c;这个调用会延迟到defer语句所在的函数执行完毕后执行&#xff0c;所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句…

vue使用echarts根据页面大小 echarts窗口自适应

1. 使用window.onresize var myChart echarts.init(document.getElementById(myChart)); window.onresize () > {myChart.resize() }优点&#xff1a; 可以根据窗口大小实现自适应 缺点&#xff1a; window.onresize是绑定到window上的&#xff0c;切换vue页面时监听依…

EXCEl——移除单元格中换行符

方法一&#xff1a;使用清除格式功能 步骤如下: 1.选中需要取消换行的单元格 2.在“开始"选项卡中找到"清除”功能&#xff0c;点击下拉菜单中的“清除格式" 3.这时单元格的换行就被取消了。 清除前效果图 清除后效果图 方法一&#xff1a;使用函数功能 步骤…

uniapp H5预览PDF文件

1&#xff0c;下载资源后hybrid文件存放在static静态文件里 (点击这里去下载文件) 2&#xff0c;pdf预览页面配置 <template><view style"width: 100vh;"><web-view :src"pdfUrl"></web-view></view> </template><…

多旋翼物流无人机节能轨迹规划(Python代码实现)

&#x1f4a5;1 概述 多旋翼物流无人机的节能轨迹规划是一项重要的技术&#xff0c;可以有效减少无人机的能量消耗&#xff0c;延长飞行时间&#xff0c;提高物流效率。下面是一些常见的节能轨迹规划方法&#xff1a; 最短路径规划&#xff1a;通过寻找起点和终点之间的最短路径…

性能测试学习阶段性总结

目录 1.前言 2.概念部分 2.1不同角度看软件性能 2.2关键词 2.3测试的方法 2.4应用领域 3.性能测试过程模型&#xff08;PTGM&#xff09; 2.1测试前期准备 2.2测试工具引入 2.3测试计划 2.4测试设计与开发 2.5测试执行和管理 2.6测试分析 总结&#xff1a; 1.前言…

visio 图片转换到 latex 中

调整图片大小 在Visio中&#xff0c;设计–>页面设置–>大小–>适应绘图&#xff0c;这样会自动去除多余空白&#xff0c;保留部分空白作为边界&#xff0c;无需使用Word。 2. 将新的Visio文件另存为pdf格式文件 3. latex 中插入pdf 格式图片

使用更少数据训练更好的alpaca

概述 该论文的研究背景是指令微调在大型语言模型中取得了重要的成果&#xff0c;但现有的训练数据质量问题导致模型性能下降。 过去的方法主要是使用低质量的数据进行指令微调&#xff0c;这些数据中存在错误或无关的回答&#xff0c;导致结果误导和训练成本增加。该论文的方…

安卓通过adb pull和adb push 手机与电脑之间传输文件

1.可以参考这篇文章 https://www.cnblogs.com/hhddcpp/p/4247923.html2.根据上面的文章&#xff0c;我做了如下修改 //设置/system为可读写&#xff1a; adb remount //复制手机中的文件到电脑中。需要在电脑中新建一个文件夹&#xff0c;我新建的文件夹为ce文件夹 adb pull …

【iOS】—— 属性关键字及weak关键字底层原理

文章目录 先来看看常用的属性关键字有哪些&#xff1a;内存管理有关的的关键字&#xff1a;&#xff08;weak&#xff0c;assign&#xff0c;strong&#xff0c;retain&#xff0c;copy&#xff09;关键字weak关键字assignweak 和 assign 的区别&#xff1a;关键字strong&#…

vue2的 element 表格单元格合并

<template><div><el-table show-summary :summary-method"getSummaries" :span-method"objectSpanMethod" :data"tableData" row-key"id" ref"tableDom" border><el-table-column label"序号&quo…

Windows与Linux取证分析

目录 一、电子数据取证基本概念 1.电子取证学 2.常规取证 3.洛卡德物质交换原理 4.电子数据范围 5.电子数据取证的概念和目的 6.电子数据取证过程 二、Linux系统取证 1.基本信息获取 &#xff08;1&#xff09;获取系统基础信息 &#xff08;2&#xff09;用户/用户…

Baichuan-13B:130亿参数的开源语言模型,引领中文和英文benchmark

Baichuan-13B: 一个强大的开源大规模语言模型 标题&#xff1a;Baichuan-13B&#xff1a;130亿参数的开源语言模型&#xff0c;引领中文和英文benchmark Baichuan-13B是由百川智能开发的一个开源大规模语言模型项目&#xff0c;包含了130亿参数。该模型在中文和英文的权威ben…

mongodb集群搭建

下载地址&#xff1a; https://www.mongodb.com/try/download/community下载mongodb-linux-x86_64-rhel70-5.0.18 搭建集群 tar -zxvf mongodb-linux-x86_64-rhel70-5.0.18.tgz mkdir -p data/dp cd mongodb-linux-x86_64-rhel70-5.0.18 mkdir -p data/db mkdir log mkdir c…

MiniGPT4系列之二推理篇命令行方式:在RTX-3090 Ubuntu服务器推理详解

MiniGPT4系列之一部署篇&#xff1a;在RTX-3090 Ubuntu服务器部署步骤详解_seaside2003的博客-CSDN博客 MiniGPT4系列之二推理篇命令行方式&#xff1a;在RTX-3090 Ubuntu服务器推理详解_seaside2003的博客-CSDN博客 MiniGPT4系列之三模型推理 (Web UI)&#xff1a;在RTX-309…

pytorch 2.0初探:和pytorch 1.13的速度对比

看到pytorch2.0出来了&#xff0c;而且宣传提速明显&#xff0c;一行代码即可提速43%左右&#xff1a; compiled_model torch.compile(model) We then measure speedups and validate accuracy across these models. Since speedups can be dependent on data-type, we measu…

Ubuntu学习笔记(二)——文件属性与权限

文章目录 前言一、用户与用户组1.用户&#xff08;文件拥有者&#xff09;2.用户组3.其他人 二、Linux用户身份与用户组记录文件1. /etc/passwd2. /etc/shadow3. /etc/group 三、文件属性与权限1. 查看文件属性的方法&#xff08;ls&#xff09;2.文件属性详细介绍2.1 权限2.2 …