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

杭州信息安全院安全研发部负责人(2013 - 2016),负责Web网站安全监测服务平台( Web 漏洞、敏感词、挂马、暗链等)的架构、设计与实现,熟悉常见 Web 漏洞的基本原理与渗透方式。现担任中国互联网最大财税平台的架构师,负责业务安全开发、安全体系建设、业务风控、API Gateway 等工作,熟悉常见 Dubbo 、HSF、Spring Cloud 等分布式服务架构设计与与实现。

文章正文

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

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

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

free -m

enter image description here

部分参数说明:

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

2.2.3 磁盘

磁盘满了很多时候会连带引起系统服务不可用等问题

enter image description here

df -h

enter image description here

du -m /path

enter image description here

2.2.4 网络

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

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

enter image description here

2.2.5 其它

vmstat:

vmstat 2 10 -t

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

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

enter image description here

r 表示运行队列(就是说多少个进程真的分配到CPU),b 表示阻塞的进程。    
swpd 虚拟内存已使
                        
2018年1月8日,周一晚8点30分,白帽子,信安从业者,前某杭州信息安全院安全研发部负责人、现为某财税平台的安全团队负责人的蓬蒿带来了主题为《Java 线上问题排查思路与工具使用》的交流。以下是主持人hrshy整理的问题精华,记录了作者和读者间问答的精彩片段。 * * * 内容提要: * 一般线上系统怎么做监控? * 一次发布,生产环境里某个节点里的容器里面服务挂了,但是在预生产环境无法重现,而生产环境监控里面显示 cpu、内存、堆栈都正常。而那个节点重启之后就正常,但是过段时间又出现问题。这种情况有什么好的方法排查问题? * 如何生成 dump 文件,如何分析?jvm crash 日志如何生成? * 业务日志和异常输出格式一般怎么设计会比较容易统计分析? * 能深入讲解一下线上监控吗? * 线上排查问题 dump 或 jstack 导出文件分析经常无响应倒置无法导出查看内存问题和线程问题,有什么经验吗? * 如果判断 gc 是正常的 gc,还是严重影响正常应用性能的 gc? * 日志都会通过 flume 采集器传输至数据中心,有什么作用,数据中心在做什么? * * * **问:一般线上系统怎么做监控?** **答:** 线上监控基本上从两个方面着手:应用监控和系统监控。 1. 线上接口调用情况可视化(调用次数、平均耗时、失败率等); 2. 数据库调用可视化(调用次数、平均耗
隐藏内容 支付可见
¥5.99 购买
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容