`

线上问题排查的常用工具和方法

    博客分类:
  • jvm
jvm 
阅读更多
在长期排查线上问题的过程中,总结了一些工具的用法和排查问题的思路,这里跟大家分享一下,在遇到类似的问题时,希望能给予一些帮助。



首先讲讲工具,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等等你想要的监控数据几乎都能看到。

讲了这么多工具,给两个实例大家分享一下,基本上上面的工具都用到了,大家可以看看在实战中这些工具是怎么配合使用起来的。
分享到:
评论

相关推荐

    【Java面试+Java学习指南】一部分大部分Java招聘所需要掌握的核心知识

    线上问题排查 集合框架 哈希映射 并发哈希映射 数组列表 向量 深入浅出JVM JVM内存模型 性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 ARM与多线程 多线程基础知识 常见关键字 ...

    Java学习指南,涵盖大部分Java程序员所需要掌握的核心知识

    性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 并发与多线程 多线程基础知识 常见关键字 多线程锁机制 线程池知识点 常见的JUC工具类 多线程经典面试题 常用工具集 JVM问题排查...

    Java异常诊断greys-anatomy.zip

    很早的时候,我们使用BTrace排查问题,在感叹BTrace的强大之余,也曾好几次将线上系统折腾挂掉。2012年淘宝的聚石写了HouseMD,将 常用的几个Btrace脚本整合在一起形成一个独立风格的应用,但其核心代码用的是Scala...

    java版飞机大战源码-java-club:Java程序员所需要掌握的核心知识都在这里。。。。alittledaily~

    性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 并发与多线程 线程状态转换与通信机制 线程同步与互斥 线程池知识点 常见的JUC工具类 常用工具集 JVM问题排查工具-JMC IDEA开发神器 ...

    JavaFamily:【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 并发与多线程 多线程基础知识 常见关键字 多线程锁机制 线程池知识点 常见的JUC工具类 多线程经典面试题 常用工具集 JVM问题排查工具...

    Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具.rar

    在线排查问题,无需重启;动态跟踪Java代码;实时监控JVM状态。对分秒必争的线上异常, Arthas可帮助我们快速诊断相关问题。 公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验...

    Mycat从入门到精通视频教程

    常见问题 日志排查 命令行工具指南 第4课 Mycat分片规则详解 Mycat 几种分片规则的使用说明以及例子 第5课 Mycat跨分片问题 Mycat跨分片聚合处理、Mycat跨分片JOIN、Mycat分布式事务 第6课 Mycat性能测试...

    mycat从入门到跑路

    Mycat从入门到精通视频教程目录介绍: 第1课 Mycat前世今生 Mycat的历史、背后的团队、发展现状、RoadMap等 第2课 Mycat原理与入门 Mycat的原理、主要功能、配置和使用入门 第3课 Mycat故障排查指南 常见问题 日志...

    java版飞机大战源码-Rockira.github.io:Rockira.github.io

    性能调优、线上问题排查 类加载机制详解 垃圾回收机制 垃圾回收器、垃圾回收算法 :jack-o-lantern:拓展知识 :open_book:Java容器 :memo:多线程 线程状态转换与通信机制 线程同步与互斥 线程池知识点 常见的JUC工具类...

    Go:使用golang的leetcode && go练习:rocket:

    一次针对线上微服务goroutine引入的问题排查(goroutine泄漏) 常用寄存器(假设是x86架构)&&常用汇编指令 golang对于两个数之和取一半的汇编代码差异(如何防止整型重叠) 两种缓存消除策略lru.go(nginx,redis,...

    php开源框架 CmlPHP.zip

    线上模式提供了详细的错误log方便排查 CmlPHP V2.x 适用于大、中、小各种类型的Web应用开发。API接口开发 CmlPHP V2.x 支持Session分布式存储 CmlPHP V2.x 支持守护工作进程 CmlPHP V2.x 提供了命令运行...

Global site tag (gtag.js) - Google Analytics