彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 彩世界时时app > Java问题排查工具

Java问题排查工具

发布时间:2019-09-22 09:22编辑:彩世界时时app浏览(180)

    Java 线上问题排查思路与工具使用,java排查

    本文来自作者 蓬蒿 在 GitChat 上分享 「Java 线上问题排查思路与工具使用」,「阅读原文」查看交流实录。

    「文末高能」

    编辑 | 哈比

    1. JPS
      列出当前Java进程
      -q 只显示进程ID
      -v 显示JVM启动参数
      -m 显示传给main的参数
      -l 显示主类的全名
    2. top -Hp <pid>
      列出当前进程中CPU占用较高的线程,其中的pid转化成十六进制后,就是线程id
    3. jstack <pid>
      可以查看当前进程中线程栈的情况。
    4. jstat -gcutil pid 3s 10
      可以查看进程的gc情况,3s表示每3秒输出一次,10代表最多10行
      jstat -gc pid 3s 10
      同样的,只是-gc会显示各个空间的大小和占用情况。
    5. jmap -histo[:live] pid
      可以查看当前堆内(存活)的对象的情况。

    一、前言

    Java 语言是当前互联网应用最为广泛的语言,作为一名 Java 程序猿,当业务相对比较稳定之后平常工作除了 coding 之外,大部分时间(70%~80%)是会用来排查突发或者周期性的线上问题。

    由于业务应用 bug(本身或引入第三方库)、环境原因、硬件问题等原因,Java 线上服务出现故障 / 问题几乎不可避免。例如,常见的现象包括部分请求超时、用户明显感受到系统发生卡顿等等。

    尽快线上问题从系统表象来看非常明显,但排查深究其发生的原因还是比较困难的,因此对开发测试或者是运维的同学产生了许多的困扰。

    排查定位线上问题是具有一定技巧或者说是经验规律的,排查者如果对业务系统了解得越深入,那么相对来说定位也会容易一些。

    不管怎么说,掌握 Java 服务线上问题排查思路并能够熟练排查问题常用工具 / 命令 / 平台是每一个 Java 程序猿进阶必须掌握的实战技能。

    笔者依据自己的 工作经验总结出一套基本的线上问题排查流程,同学们可以根据自己的实际工作情况进行归纳总结。

    持续更新

    二、Java 服务常见线上问题

    所有 Java 服务的线上问题从系统表象来看归结起来总共有四方面:CPU、内存、磁盘、网络。例如 CPU 使用率峰值突然飚高、内存溢出 (泄露)、磁盘满了、网络流量异常、FullGC 等等问题。

    基于这些现象我们可以将线上问题分成两大类: 系统异常、业务服务异常。

    1. 系统异常

    常见的系统异常现象包括:  CPU 占用率过高、CPU 上下文切换频率次数较高、磁盘满了、磁盘 I/O 过于频繁、网络流量异常 (连接数过多)、系统可用内存长期处于较低值 (导致 oom killer) 等等。

    这些问题可以通过 top(cpu)、free(内存)、df(磁盘)、dstat(网络流量)、pstack、vmstat、strace(底层系统调用) 等工具获取系统异常现象数据。

    此外,如果对系统以及应用进行排查后,均未发现异常现象的更笨原因,那么也有可能是外部基础设施如 IAAS 平台本身引发的问题。

    例如运营商网络或者云服务提供商偶尔可能也会发生一些故障问题,你的引用只有某个区域如广东用户访问系统时发生服务不可用现象,那么极有可能是这些原因导致的。

    今天我司部署在阿里云华东地域的业务系统中午时分突然不能为广东地区用户提供正常服务,对系统进行各种排查均为发现任何问题。

    最后,通过查询阿里云公告得知原因是 “ 广东地区电信线路访问华东地区互联网资源(包含阿里云华东 1 地域)出现网络丢包或者延迟增大的异常情况 “。

    2. 业务服务异常

    常见的业务服务异常现象包括: PV 量过高、服务调用耗时异常、线程死锁、多线程并发问题、频繁进行 Full GC、异常安全攻击扫描等。

    三、问题定位

    我们一般会采用排除法,从外部排查到内部排查的方式来定位线上服务问题。

    • 首先我们要排除其他进程 (除主进程之外) 可能引起的故障问题;

    • 然后排除业务应用可能引起的故障问题;

    • 可以考虑是否为运营商或者云服务提供商所引起的故障。

    1. 定位流程

    1.1 系统异常排查流程

    1.2 业务应用排查流程

    2. Linux 常用的性能分析工具

    Linux 常用的性能分析工具使用包括 : top(cpu)、free(内存)、df(磁盘)、dstat(网络流量)、pstack、vmstat、strace(底层系统调用) 等。

    2.1 CPU

    CPU 是系统重要的监控指标,能够分析系统的整体运行状况。监控指标一般包括运行队列、CPU 使用率和上下文切换等。

    top 命令是 Linux 下常用的 CPU 性能分析工具 , 能够实时显示系统中各个进程的资源占用状况 , 常用于服务端性能分析。

    top 命令显示了各个进程 CPU 使用情况 , 一般 CPU 使用率从高到低排序展示输出。其中 Load Average 显示最近 1 分钟、5 分钟和 15 分钟的系统平均负载,上图各值为 2.46,1.96,1.99。

    我们一般会关注 CPU 使用率最高的进程,正常情况下就是我们的应用主进程。第七行以下:各进程的状态监控。

    PID : 进程 id
    USER : 进程所有者
    PR : 进程优先级
    NI : nice 值。负值表示高优先级,正值表示低优先级
    VIRT : 进程使用的虚拟内存总量,单位 kb。VIRT=SWAP+RES
    RES : 进程使用的、未被换出的物理内存大小,单位 kb。RES=CODE+DATA
    SHR : 共享内存大小,单位 kb
    S : 进程状态。D= 不可中断的睡眠状态 R= 运行 S= 睡眠 T= 跟踪 / 停止 Z= 僵尸进程
    %CPU : 上次更新到现在的 CPU 时间占用百分比
    %MEM : 进程使用的物理内存百分比
    TIME+ : 进程使用的 CPU 时间总计,单位 1/100 秒
    COMMAND : 进程名称
    

    2.2 内存

    内存是排查线上问题的重要参考依据,内存问题很多时候是引起 CPU 使用率较高的见解因素。

    系统内存:free 是显示的当前内存的使用 ,-m 的意思是 M 字节来显示内容。

    free -m
    

    部分参数说明:

      total 内存总数: 3790M
      used 已经使用的内存数: 1880M
      free 空闲的内存数: 118M
      shared 当前已经废弃不用 , 总是 0
      buffers Buffer 缓存内存数: 1792M

    2.3 磁盘

    df -h
    
    
    
    du -m /path
    

    2.4 网络

    dstat 命令可以集成了 vmstat、iostat、netstat 等等工具能完成的任务。

       dstat -c  cpu 情况
        -d 磁盘读写
            -n 网络状况
            -l 显示系统负载
            -m 显示形同内存状况
            -p 显示系统进程信息
            -r 显示系统 IO 情况
    

    2.5 其它

    vmstat:

    vmstat 2 10 -t
    

    vmstat 是 Virtual Meomory Statistics(虚拟内存统计)的缩写 , 是实时系统监控工具。该命令通过使用 knlist 子程序和 /dev/kmen 伪设备驱动器访问这些数据,输出信息直接打印在屏幕。

    使用 vmstat 2 10  -t 命令,查看 io 的情况 (第一个参数是采样的时间间隔数单位是秒,第二个参数是采样的次数)。

    r 表示运行队列 (就是说多少个进程真的分配到 CPU),b 表示阻塞的进程。    
    swpd 虚拟内存已使用的大小,如果大于 0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
    free   空闲的物理内存的大小,我的机器内存总共 8G,剩余 3415M。
    buff   Linux/Unix 系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用 300 多 M
    cache 文件缓存
    si 列表示由磁盘调入内存,也就是内存进入内存交换区的数量;
    so 列表示由内存调入磁盘,也就是内存交换区进入内存的数量
    一般情况下,si、so 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要考虑是否增加系统内存。    
    bi 从块设备读入数据的总量(读磁盘)(每秒 kb)
    bo 块设备写入数据的总量(写磁盘)(每秒 kb)
    随机磁盘读写的时候,这两个值越大 ((超出 1024k),能看到 cpu 在 IO 等待的值也会越大
    这里设置的 bi+bo 参考值为 1000,如果超过 1000,而且 wa 值比较大,则表示系统磁盘 IO 性能瓶颈。
    in 每秒 CPU 的中断次数,包括时间中断
    cs(上下文切换 Context Switch)
    

    strace:strace 常用来跟踪进程执行时的系统调用和所接收的信号。

    strace -cp tid
    strace -T -p tid
        -T 显示每一调用所耗的时间 .
        -p pid  跟踪指定的进程 pid.
        -v 输出所有的系统调用 . 一些调用关于环境变量 , 状态 , 输入输出等调用由于使用频繁 , 默认不输出 .
        -V 输出 strace 的版本信息 .
    

    本文由彩世界平台发布于彩世界时时app,转载请注明出处:Java问题排查工具

    关键词: