Java 服务线上问题排查思路与工具使用

向作者提问
白帽子,安全架构师。2013-2016某杭州信息安全院安全研发部负责人,负责《网站安全监测服务平台》(Web漏洞、敏感词、挂马、暗链等)的架构、设计与实现,熟悉常见web漏洞的渗透方式与防御方式。现为某财税平台的安全团队负责人,负责业务安全开发、安全体系建设、业务风控、API Gateway等工作。熟悉常见dubbo、hsf、spring cloud等分布式服务架构设计与开发,有兴趣可带上简历。
查看本场Chat

0. 前言

Java 语言是当前互联网应用最为广泛的语言,作为一名 Java 程序猿,当业务相对比较稳定之后平常工作除了 coding 之外,大部分时间(70%~80%)是会用来排查突发或者周期性的线上问题。由于业务应用 bug(本身或引入第三方库)、内外部环境、底层硬件问题等原因,Java线上服务出现故障/问题几乎不可避免。例如,常见的现象包括部分请求超时、用户明显感受到系统发生卡顿等等。

尽管线上问题从系统表象来看非常明显,但排查深究其发生的原因还是比较困难的,因此对开发测试或者是运维的同学产生了许多的困扰。排查定位线上问题是具有一定技巧或者说是经验规律的,排查者如果对业务系统了解得越深入,那么相对来说定位也会容易一些。

不管怎么说,掌握 Java 服务线上问题排查思路并能够熟练排查问题常用工具/命令/平台是每一个 Java 程序猿进阶必须掌握的实战技能。笔者依据自己的 工作经验总结出一套基本的线上问题排查流程,同学们可以根据自己的实际工作情况进行归纳总结。

1. Java 服务常见线上问题

所有 Java 服务的线上问题从系统表象来看归结起来总共有四方面:CPU、内存、磁盘、网络。例如 CPU 使用率峰值突然飚高、内存溢出(泄露)、磁盘满了、网络流量异常、FullGC 等等问题。基于这些现象我们可以将线上问题分成两大类: 系统异常、业务服务异常。

1.1 系统异常

常见的系统异常现象包括: CPU 占用率过高、CPU上下文切换频率次数较高、磁盘满了、磁盘 I/O 过于频繁、网络流量异常(连接数过多)、系统可用内存长期处于较低值(导致 oom killer)等等。这些问题可以通过 top(cpu)、free(内存)、df(磁盘)、dstat(网络流量)、pstack、vmstat、strace(底层系统调用)等工具获取系统异常现象数据。

此外,如果对系统以及应用进行排查后,均未发现异常现象的根本原因,那么也有可能是因为外部基础设施 IAAS 平台所引发的问题。例如运营商网络或者云服务提供商偶尔可能也会发生一些故障问题,你的引用只有某个区域如广东用户访问系统时发生服务不可用现象,那么极有可能是这些原因导致的。今天,我司部署在阿里云华东地域的业务系统中午时分突然不能为广东地区用户提供正常服务,对系统进行各种排查均为发现任何问题。最后,通过查询阿里云公告得知原因是"广东地区电信线路访问华东地区互联网资源(包含阿里云华东1地域)出现网络丢包或者延迟增大的异常情况"。

https://help.aliyun.com/noticelist/articleid/20724342.html?spm=5176.789004748.n2.6.LeTsMp

1.2 业务服务异常

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

2. 问题定位

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

  • 首先我们要排除其他进程(除主进程之外)可能引起的故障问题
  • 其次排除业务应用可能引起的故障问题
  • 最后可以考虑是否为运营商或者云服务提供商所引起的故障

2.1 定位流程

2.1.1 系统异常排查流程

enter image description here

2.1.2 业务应用排查流程

enter image description here

2.2 Linux 常用的性能分析工具

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

2.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.2 内存

李志博
这么好的文章,为什么要卖给大家,单卖我1个不好么。。
míng: ...
蓬蒿: 还会写一篇高级篇,服务化治理脚本
jackson: 第二篇啥时候出来,老师
yonguo
一般线上系统怎么做监控?
微信扫描登录