网站开发类标书报价明细表,视频网站费用,易县做网站,wordpress ghost线上故障主要会包括cpu、磁盘、内存以及网络问题#xff0c;而大多数故障可能会包含不止一个层面的问题#xff0c;所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的#xff0c;基本上出问题就是df、free、top 三连#x…线上故障主要会包括cpu、磁盘、内存以及网络问题而大多数故障可能会包含不止一个层面的问题所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的基本上出问题就是df、free、top 三连然后依次jstack、jmap伺候具体问题具体分析即可。 文章目录 CPU 篇查看实时线程堆栈信息对jstack文件进行分析频繁GC上下文切换 内存篇如何分析Dump文件内容youngGC 过于频繁youngGC 耗时过长 磁盘篇网络篇netstat 附录jstack 线程快照jstat 虚拟机运行时统计jmap内存快照jinfo 虚拟机配置参数netstat文本分析命令 CPU 篇
原因包括业务逻辑问题一般是死循环、频繁gc以及上下文切换过多可使用jstack分析线程对应的堆栈情况
查看实时线程堆栈信息
top命令查找cpu使用率较高的进程接着用 top -Hp pid 找到cpu使用率较高的线程printf %x\n pid 转换为nid使用 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更不用多说了 将jstack信息输出到log文件中 jstack -l pid pid.jstack.logcat jstack.log | grep java.lang.Thread.State | sort -nr | uniq -c
对jstack状态有一个整体的把握如果WAITING之类的特别多多半有问题
cat jstack.log | grep -i -E BLOCKED | deadlock
观察处于BOLCKED状态的线程数量以及死锁信息 频繁GC
jstat -gc pid 1000 对gc分代变化情况进行观察1000表示采样间隔ms
S0C/S1CS0U/S1UEC/EUOC/OUMC/MUS0/S1 容量(kb)S0/S1 使用量(kb)Eden区容量/使用量(kb)老年代容量/使用量(kb)元数据区容量/使用量(kb) 次数代表从应用程序启动到采样时的次数
YGC/YGTFGC/FGCTGCTYoungGC 次数/耗时sFullGC 次数/耗时s总耗时s 上下文切换
vmstat pid 命令 cs(context switch) 代表上下文切换次数
pidstat -w pid 命令 cswch 自愿切换/nvcswch 非自愿切换 内存篇
导出dump文件 jmap -dump:formatb,filefilename.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命令的常见参数如下 -l除了打印线程堆栈信息外还会额外打印关于锁的附加信息如拥有该锁的线程等待的条件。 -F当正常情况下无法获得线程快照时强制生成线程快照。这通常在JVM处于死锁或长时间无响应状态时使用。 -m除了打印线程堆栈信息外还会打印与线程关联的本地方法堆栈信息。 -h或-help打印jstack命令的帮助信息包括所有可用的参数和选项。
常见的jstack用法如下 打印Java进程的线程快照 jstack pidpid是Java进程的进程ID。 打印Java进程的线程快照并将结果保存到文件中 jstack pid thread_dump.txt将线程快照输出重定向到文件thread_dump.txt中以便后续分析和查看。 使用特定的参数生成线程快照 jstack -l -F pid这个命令将生成带有附加锁信息的强制线程快照。 生成线程快照并指定输出到标准错误流stderr jstack -l pid 2 error.log这个命令将线程快照输出到标准错误流并将其重定向到文件error.log中。 使用jstack命令连接到远程Java进程并生成线程快照 jstack -l hostname:porthostname是远程主机的名称或IP地址port是远程Java进程的调试端口。
jstack命令是诊断Java应用程序中线程问题的有用工具可用于定位性能问题、死锁和线程等待等情况。通过分析线程快照可以获得关于线程状态、锁的信息以及线程之间的相互关系帮助开发人员进行故障排除和性能优化。
关于java.lang.Thread.State
要根据jstack命令输出的内容中的java.lang.Thread.State来判断系统的总体运行情况可以关注线程的状态并进行分析。java.lang.Thread.State表示线程的状态可以提供有关线程活动和阻塞的信息。以下是一些常见的线程状态和它们的含义 RUNNABLE可运行状态线程正在执行或者等待CPU资源执行。 BLOCKED阻塞状态线程正在等待获取锁而其他线程已经持有了该锁。 WAITING等待状态线程正在等待另一个线程发出特定信号直到其他线程通知它继续执行。 TIMED_WAITING计时等待状态线程正在等待一段时间直到超时或者其他线程通知它继续执行。 TERMINATED终止状态线程已经执行完毕或者因为异常等原因被终止。
通过观察jstack命令输出中各个线程的状态可以对系统的总体运行情况进行初步判断。下面是一些常见的判断场景 如果大多数线程处于RUNNABLE状态系统可能正常运行并且没有明显的性能瓶颈。 如果有大量线程处于BLOCKED状态系统可能存在严重的竞争条件或死锁情况。需要进一步分析具体的线程堆栈信息来解决问题。 如果有线程处于WAITING或TIMED_WAITING状态可以根据线程等待的对象或条件来判断是否有资源争用或线程间通信的问题。 如果有线程处于TERMINATED状态表示线程已经执行完毕但可以进一步观察是否有异常抛出或其他异常情况发生。
需要注意的是仅通过线程状态无法完全确定系统的总体运行情况因为线程状态只是系统的一个方面。综合考虑线程状态、线程数量、CPU使用率、内存使用情况等信息可以更全面地评估系统的运行状况。在分析线程堆栈信息时还应注意查看是否存在异常、死锁、阻塞等特定的线程问题并进行相应的故障排除和性能优化。
jstat 虚拟机运行时统计
jstat是Java开发工具包JDK中的一个命令行工具用于监视和收集Java虚拟机JVM的各种运行时统计信息。它可以提供有关堆内存、垃圾回收、类加载、线程和编译器等方面的数据用于性能分析和故障排除。
jstat命令的常见参数如下 -class打印类加载、卸载和总计的统计信息。 -compiler打印JIT编译器的统计信息包括编译任务数量、编译耗时等。 -gc打印垃圾回收统计信息包括堆内存使用情况、垃圾回收次数、回收时间等。 -gccapacity打印堆内存容量和使用情况的详细信息包括新生代、老年代、持久代的容量、使用量和空闲量等。 -gcutil打印垃圾回收统计信息的摘要包括垃圾回收器的使用率、堆内存的使用率等。 -printcompilation打印JIT编译器编译方法的详细信息包括方法名称、编译状态、编译耗时等。 -utilization打印垃圾回收器的利用率包括新生代、老年代、元数据区的利用率。 -options打印JVM的命令行选项和系统属性。
常见的jstat用法如下 监视Java进程的类加载情况 jstat -class pid [interval] [count]pid是Java进程的进程ID[interval]是采样间隔时间以毫秒为单位默认值为1000ms[count]是采样次数默认值为无限次。 监视Java进程的垃圾回收统计信息 jstat -gc pid [interval] [count]pid是Java进程的进程ID[interval]是采样间隔时间以毫秒为单位默认值为1000ms[count]是采样次数默认值为无限次。 监视Java进程的堆内存容量和使用情况 jstat -gccapacity pid [interval] [count]pid是Java进程的进程ID[interval]是采样间隔时间以毫秒为单位默认值为1000ms[count]是采样次数默认值为无限次。 监视Java进程的JIT编译器统计信息 jstat -compiler pid [intervaljmap内存快照
jmap是Java开发工具包JDK中的一个命令行工具用于生成Java进程的内存映像和堆转储快照。它可以用于分析Java应用程序的内存使用情况、查找内存泄漏和性能问题等。
jmap命令的常见参数如下 -heap打印Java进程的堆内存使用情况包括堆的大小、使用量、垃圾回收器的详细信息等。 -histo打印Java进程的堆内存中对象的统计信息包括对象类型、数量和占用内存大小等。 -dump:dump-options生成Java进程的堆转储快照Heap Dump可以用于分析内存泄漏和对象分布等。dump-options可以是以下选项之一 live只转储活动对象默认选项。all转储所有对象包括活动对象和垃圾对象。filefilename.hprof将堆转储快照保存到指定的文件中。formatformat指定堆转储快照的格式可以是b二进制格式或h文本格式默认值。 -finalizerinfo打印等待终结的对象的信息包括等待终结队列的长度和具体对象的信息。 -permstat打印永久代PermGen/Metaspace的统计信息包括类加载器、类和字符串的数量和占用内存大小等。
常见的jmap用法示例如下 打印Java进程的堆内存使用情况 jmap -heap pidpid是Java进程的进程ID。 打印Java进程的堆内存中对象的统计信息 jmap -histo pidpid是Java进程的进程ID。 生成Java进程的堆转储快照并保存到文件中 jmap -dump:filefilename pidfilename是要保存堆转储快照的文件名pid是Java进程的进程ID。 打印等待终结的对象的信息 jmap -finalizerinfo pidpid是Java进程的进程ID。 打印永久代PermGen/Metaspace的统计信息 jmap -permstat pidpid是Java进程的进程ID。
jmap命令是一个强大的工具可以帮助开发人员分析Java应用程序的内存使用情况和性能问题。通过使用不同的参数组合可以获取有关堆内存、对象统计、堆转储等方面的详细信息。请注意在使用jmap命令时建议谨慎使用并避免在生产环境中使用以避免对应用程序性能产生负面影响。
jinfo 虚拟机配置参数
jinfo是Java开发工具包JDK中的一个命令行工具用于查看和调整Java进程的Java虚拟机JVM配置参数和系统属性。它可以帮助开发人员获取Java进程的运行时信息并对其进行动态调整。
jinfo命令的常见参数如下 -flag name打印指定JVM参数的当前值和默认值。 -flags打印Java进程的所有JVM参数和系统属性。 -sysprops打印Java进程的所有系统属性。 -h或-help打印jinfo命令的帮助信息包括所有可用的参数和选项。
常见的jinfo用法示例如下 打印Java进程的指定JVM参数的当前值和默认值 jinfo -flag name pidname是要打印的JVM参数的名称pid是Java进程的进程ID。 打印Java进程的所有JVM参数和系统属性 jinfo -flags pidpid是Java进程的进程ID。 打印Java进程的所有系统属性 jinfo -sysprops pidpid是Java进程的进程ID。
jinfo命令可以帮助开发人员获取Java进程的运行时信息如JVM参数和系统属性的值。通过查看这些信息可以了解Java进程的配置和环境帮助进行故障排除和性能优化。此外jinfo还可以用于动态调整JVM参数的值但在使用时需要谨慎避免对应用程序产生不可预知的影响。
netstat
netstat命令的一些常见用法示例以帮助排查端口被哪个进程占用等相关信息 显示所有活动连接和监听端口 netstat -a仅显示TCP连接 netstat -at仅显示UDP连接 netstat -au显示与网络连接关联的进程/程序 netstat -ap显示正在监听的TCP端口 netstat -ltn显示正在监听的UDP端口 netstat -lun显示与指定端口相关的进程/程序 netstat -tulpn | grep 端口号例如要查找占用端口80的进程可以使用 netstat -tulpn | grep :80显示网络统计信息和摘要 netstat -s显示路由表信息 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 按照数值降序从大到小