暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈排查服务器故障的常用方法

轻聊浅谈闲码 2021-01-01
1481


Arthas

安装
  1. curl -O https://arthas.aliyun.com/arthas-boot.jar

使用
  1. 运行java -jar arthas-boot.jar,并选择要查看的进程


  2. Dashboard:显示当前线程的信息

  3. thread 线程id:显示线程信息

  4. jad 类名:反编译class

  5. watch 类名 方法名 returnObj:查看返回值

常用命令
  • 基础命令
    help——查看命令帮助信息
    cat——打印文件内容,和linux里的cat命令类似
    echo–打印参数,和linux里的echo命令类似
    grep——匹配查找,和linux里的grep命令类似
    tee——复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
    pwd——返回当前的工作目录,和linux命令类似
    cls——清空当前屏幕区域
    session——查看当前会话的信息
    reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
    version——输出当前目标 Java 进程所加载的 Arthas 版本号
    history——打印命令历史
    quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
    stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
    keymap——Arthas快捷键列表及自定义快捷键

  • jvm相关
    dashboard——当前系统的实时数据面板
    thread——查看当前 JVM 的线程堆栈信息
    jvm——查看当前 JVM 的信息
    sysprop——查看和修改JVM的系统属性
    sysenv——查看JVM的环境变量
    vmoption——查看和修改JVM里诊断相关的option
    perfcounter——查看当前 JVM 的Perf Counter信息
    logger——查看和修改logger
    getstatic——查看类的静态属性
    ognl——执行ognl表达式
    mbean——查看 Mbean 的信息
    heapdump——dump java heap, 类似jmap命令的heap dump功能

  • class/classloader相关
    sc——查看JVM已加载的类信息
    sm——查看已加载类的方法信息
    jad——反编译指定已加载类的源码
    mc——内存编译器,内存编译.java文件为.class文件
    redefine——加载外部的.class文件,redefine到JVM里
    dump——dump 已加载类的 byte code 到特定目录
    classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

  • monitor/watch/trace相关
    请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 stop 或将增强过的类执行 reset 命令。
    monitor——方法执行监控
    watch——方法执行数据观测
    trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
    stack——输出当前方法被调用的调用路径
    tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

  • profiler/火焰图
    profiler–使用async-profiler对应用采样,生成火焰图

  • options
    options——查看或设置Arthas全局开关

  • 管道
    Arthas支持使用管道对上述命令的结果进行进一步的处理,如sm java.lang.String * | grep ‘index’
    grep——搜索满足条件的结果
    plaintext——将命令的结果去除ANSI颜色
    wc——按行统计输出结果

系统自带诊断工具

uptime:系统运行时间,1分钟5分钟15分钟内平均负载查看

dmesg|tail:输出系统日志的最后10行,常见的OOM kill和TCP丢包都记录在这里

vmstat 1:系统实时性能检测工具,r等待CPU资源的进程数,b阻塞在不可中断休眠状态的进程数
free -m:内存使用情况查看

top:系统全局指标信息查看

netstat -tanp:查看TCP网络连接情况

当TIME_WAIT或CLOSE_WAIT连接过多时,会影响应用相应速度,前者需要优化内核参数,后者一般是代码bug没有释放网络连接

mpstat -P ALL 1:显示每个CPU的使用情况

sar -n DEV 1:查看网络设备的吞吐率,可以查看是否超过网卡限制

sar -n TCP,ETCP 1:查看TCP连接状态

iostat -xz 1:查看磁盘IO情况

  • r/s,w/s,rkB/s,wKB/s等指标过大,可能会引起性能问题

  • await(一次IO超过20ms就说明磁盘压力过大)过大,可能是硬件设备遇到了瓶颈或者出现故障

  • aqu-sz大于1,可能是硬件设备已经饱和

  • %util越大表示磁盘越繁忙

JDK诊断工具:

  • jstack:打印java堆栈信息

  • jmap:java内存映射工具Java Memory Map

  • jhat:Java堆分析工具Java Heap Analysis Tool

  • jinfo:Java配置信息工具 Java Configuration Information

  • jstat:JVM统计监测工具JVM Statistics Monitoring Tool,显示JVM的性能统计信息,GC统计信息

  • jcmd:Java命令行

  • visualvm:通过JMX接口连接JVM进程,从而看到JVM上的线程,内存,类等信息

  • jconsole:显示具体的线程堆栈信息以及内存中各个年代的占用情况

Java cpu占用原因查看

  1. top命令获取CPU占用最高的进程pid

  2. top -Hp pid :查看占用 CPU 最高的线程id

  3. printf ‘0x%x’ 线程 id:将线程id转化成16进制线程id

  4. jstack 进程pid | grep 16进制线程id -A 30:查看线程堆栈信息

  5. jstack –l pid | grep -i –E ‘Blocked | Deadlock’:查看阻塞线程堆栈信息
    值得关注的线程状态有:

  • 死锁,Deadlock(重点关注)

  • 执行中,Runnable

  • 等待资源,Waiting on condition(重点关注)

  • 等待获取监视器,Waiting on monitor entry(重点关注)

  • 暂停,Suspended

  • 对象等待中,Object.wait() 或 TIMED_WAITING

  • 阻塞,Blocked(重点关注)

  • 停止,Parked

查看jvm内存使用情况:

查看存活对象:jmap -histo:live 进程PID
生成dump文件:jmap -dump:format=b,file=xxx.hprof 进程PID
生成dump文件(先进行一次Full GC):jmap -dump:format=b,live,file=xxx.hprof 进程PID
使用jhat分析dump文件,打开localhost:7000查看内存中的具体对象使用情况

文章转载自轻聊浅谈闲码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论