在长期排查线上问题的过程中,总结了一些工具的用法和排查问题的思路,这里跟大家分享一下,在遇到类似的问题时,希望能给予一些帮助。
首先讲讲工具,JVM自带的一些工具是必须熟练掌握的,例如jstack, jmap, jstat等,它们可以帮我们去深入了解JVM正在做的事情,主要的适用领域有这些:
1、jstack
jstack可以告诉你当前所有JVM线程正在做什么,包括用户线程和虚拟机线程,你可以用它来查看线程栈,并且结合Lock信息来检测是否发生了死锁和死锁的线程。
没事儿jstack一下,知道你的小伙伴正在做什么。
另外在用top -H看到占用CPU非常高的pid时,可以转换成16进制后在jstack dump出来的文件中搜索,看看到底是什么线程占用了CPU。
2、jstat
stat,顾名思义就是提供一些统计信息,它可以告诉你当前的GC情况,包括GC次数、时间,具体的GC还可以结合gc.log文件去分析。
一般来说,我们用jstat去查看GC情况,判断是否存在YGC或FGC频繁的情况,再去看gc.log和jamp dump内存,MAT分析来定位问题(后面会有一个case针对这种场景)。
常用的用法是jstat -gcutil pid time(间隔)
3、jmap
排查GC问题必然会用到的工具,jmap可以告诉你当前JVM内存堆中的对象分布及其关系,当你dump堆之后可以用MAT分析,看看有哪些大对象,或者哪些类的实例特别多。
常用用法:强制FGC:-histo:live
dump堆:-dump:[live],format=b,file=dump.bin
查看各代内存占用情况:-heap
然后我们来介绍一些开源的工具,来增强JVM工具本身的作用。
1、MAT(Eclipse Memory Analyzer)
GC分析必备,用于分析jmap或OOM时dump出来的内存快照,可以看到对象和引用关系。
2、top
这个是Linux自带的命令,查看系统资源消耗情况,可以看看CPU、内存、SWAP、I/O的消耗情况,需要特别注意的有几个值:
ni,这个值如果特别高说明线程上下文切换开销较大,看看是不是开了太多的线程导致的
res,这个代表了进程实际占用的内存
swap,内存不足就会占用swap空间,这个时候一般应用的性能会急剧下降,需要特别关注
3、HouseMD
一个类似于BTrace的工具,用于对JVM运行时的状态进行追踪和诊断,作者是中间件团队的聚石。
通常我们排查问题很多时候都在代码中加个日志,看看方法的参数、返回值是不是我们期望的,然后编译打包部署重启应用,十几分钟就过去了。HouseMD可以直接让你可以追踪到方法的返回值和参数,以及调用次数、调用平均rt、调用栈。甚至是类的成员变量的值、Class加载的路径、对应的ClassLoader,都可以用一行命令给你展现出来,堪称神器。
更多的用法可以参考详细的WiKi:https://github.com/CSUG/HouseMD
再偷偷告诉你,因为HouseMD是基于字节码分析来做的,所以理论上运行在JVM的语言都可以用它,包括Groovy,Clojure都可以。
4、TBJMap
通过jmap和MAT我们可以知道整个JVM堆的对象分布情况,但是有时候我们需要知道young/old/perm区分别有哪些对象的时候,就要用到TBJMap这个神器了。作者是中间件团队的叔同。
他可以告诉你各个分代区各个Class的实例数、占用的空间,以及DirectMemory占用的空间等。
用法很简单,一行命令即可。WiKi:https://github.com/alibaba/TBJMap
5、tsar
tsar是淘宝的采集工具,主要用来收集服务器的系统信息(如cpu,io,mem,tcp等)以及应用数据(如squid haproxy nginx等),tsar支持t实时查看和历史查看,方便了解应用和服务器的信息。
Usage: tsar [options]
Options:
-check display last record for alert
--check/-C display last record for alert.example:tsar --check / tsar --check --cpu --io
--cron/-c run in cron mode, output data to file
--interval/-i specify intervals numbers, in minutes if with --live, it is in seconds
--list/-L list enabled modules
--live/-l running print live mode, which module will print
--file/-f specify a filepath as input
--ndays/-n show the value for the past days (default: 1)
--date/-d show the value for the specify day(n or YYYYMMDD)
--merge/-m merge multiply item to one
--detail/-D do not conver data to K/M/G
--spec/-s show spec field data, tsar --cpu -s sys,util
--help/-h help
Modules Enabled:
--cpu CPU share (user, system, interrupt, nice, & idle)
--mem Physical memory share (active, inactive, cached, free, wired)
--swap swap usage
--tcp TCP traffic (v4)
--udp UDP traffic (v4)
--traffic Net traffic statistics
--io Linux I/O performance
--pcsw Process (task) creation and context switch
--partition Disk and partition usage
--tcpx TCP connection data
--load System Run Queue and load average
用不同的参数可以看到历史和实时信息,CPU、Load、内存、网络、QPS、rt等等你想要的监控数据几乎都能看到。
讲了这么多工具,给两个实例大家分享一下,基本上上面的工具都用到了,大家可以看看在实战中这些工具是怎么配合使用起来的。
分享到:
相关推荐
下面详细地介绍一些常用的线上问题排查工具和手段,以及它们在实际中的应用场景。 首先,日志分析是排查问题的基础。日志记录了系统运行的详细信息,包括用户访问、系统错误、性能问题等。对于Linux系统中的Web...
本文档围绕Java线上故障排查提供了详尽的方案和知识点,覆盖了从问题定位到解决方案的多个方面。 首先,了解Java线上常见问题的分类是非常重要的。在生产环境中,问题可大致分为系统异常和业务异常两大类。系统异常...
Java线上故障排查是一项复杂而关键的任务,需要系统地收集和分析信息,以便快速定位并解决问题。...在实际操作中,结合应用的具体情况和异常表现,灵活运用这些工具和方法,可以有效地找到问题根源并解决它。
### 线上问题调查常用命令 在IT运维与开发工作中,线上问题的排查与解决是维护系统稳定性和用户体验的关键环节。...通过上述工具和技术的应用,可以在很大程度上提高线上问题的排查效率和准确性,确保系统的稳定运行。
本文将详细介绍Arthas在线问题排查思路,包括常见的排查场景、改进策略和排查思路。 常见的排查场景 在实际开发中,我们经常会遇到一些在线问题,例如前端工程Jenkins发布后,客户请求时好时坏的问题。这种问题...
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
本文主要讨论了四种常见的线上故障类型:CPU问题、频繁GC、上下文切换过多以及磁盘问题,并提供了相应的排查工具和方法。 首先,CPU异常是较易察觉的故障类型。当CPU使用率过高时,通常需要通过`jstack`分析线程...
Java开发中的线上问题排查命令详解是指在Java开发中使用的一些常用命令来排查和解决线上问题。这些命令主要来自JDK的lib/tools.jar类库,安装JVM时会被安装到机器的bin目录下。 以下是这些命令的详细介绍: 1. jps...
常见的问题排查工具箱包括 CPU:top –Hp、系统内存:free –m、IO:iostat、磁盘:df –h、网络链接:netstat、gc:jstat –gcutil、线程:jstack、Java 内存:jmap 等。 本文提供了一套相对有规律的问题定位处理...
本篇文章将探讨一个常见的问题——"线上应用故障排查之一:高CPU占用"。高CPU占用可能导致系统响应变慢,影响用户体验,甚至可能导致服务崩溃。解决这个问题需要深入理解应用程序的运行机制以及系统资源的管理。 ...
线上问题排查 集合框架 哈希映射 并发哈希映射 数组列表 向量 深入浅出JVM JVM内存模型 性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 ARM与多线程 多线程基础知识 常见关键字 ...
- 结合上述工具和方法,综合判断造成负载高的根本原因,并采取相应措施优化。 #### 五、总结 针对MySQL线上常见的各种故障,我们需要建立一套完整的监控体系,通过实时监控、日志分析、性能测试等多种手段来确保...
在Java生态系统中,众多的技术框架、开源中间件和系统架构为开发者提供了丰富的工具和解决方案。本次技术讲座将全面探讨以下几个核心领域: 1. **Java技术框架**:Spring框架是Java开发中的基石,它包括Spring Core...
在生产环境中,线上服务经常会出现异常情况,例如突然抛出异常、服务 RT 延迟上升、服务运行状态和预期不一致等问题。这些问题都需要快速诊断和解决,以免影响业务的正常运行。 Arthas 正是为解决这些问题而生的。 ...
性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 并发与多线程 多线程基础知识 常见关键字 多线程锁机制 线程池知识点 常见的JUC工具类 多线程经典面试题 常用工具集 JVM问题排查...
使用JVM命令和一查看这个JVM参数,帮助我们排查、解决问题。 1 JDK的命令行工具 JDK的命令行工具大多数是对JDK/lib/tools.jar类库的一层薄包装而已,它们的主要功能代码是在tools类库中实现的。Linux下的这些工具有...
知识点7:线上服务CPU100%问题排查实战 这个实战演练展示了如何快速地定位线上服务CPU100%的问题。通过使用top、pstack/jstack等工具,我们可以快速地找到问题代码,解决问题。 本篇文章提供了一个完整的解决方案...