关于java:线上故障如何排查

32次阅读

共计 2366 个字符,预计需要花费 6 分钟才能阅读完成。

前言

说起线上故障,程序员应该都经验过,从故障解决复原过程中咱们能疾速进步。踩坑多了,缓缓也就成了大牛。这道题也是大厂的面试官们特地喜爱问的问题之一,从候选人对这道题的答复过程中,面试官至多能获取到两个方面的反馈。第一是你平时负责的我的项目是不是外围我的项目,如果你说你负责的是后管零碎,出了问题重启就 OK 了,那后果只能是出门右转了。第二是候选人系统化解决问题的能力。你是如何疾速止血;如何一步步疾速定位到具体问题;故障前的筹备工作是否充沛,危险点有没有紧急应答计划。

上面咱们就一起来聊聊线上故障的排查过程

疾速止血

在分布式系统环境中,最重要的就是疾速止血。在互联网公司呆过的同学晓得,恐怖的复盘大会往往第一个问题就是为什么故障花了半个小时,业务都投诉了才晓得。或者是为什么花了 15 分钟才晓得是慢 SQL 问题,被按在地上摩擦的不要不要的。

起因是在分布式系统中,故障很容易产生“多米诺骨牌效应”。比方一个基建服务因为一个慢 sql 导致申请响应变慢,就会导致上游的申请沉积,线程无奈开释,进而导致上线的零碎也变的很慢,呈现大量 error。这个雪崩过程有时候很快,到时候测试,运维,上游零碎的负责人在各种电话,信息轰炸你的时候,这时候的你必定是

怎么办?如果问题定位了很长时间还没定位到,那就只能先用杀手锏了:

  • 重启 零碎不可用时先重启,先保证系统的可用性,具体性能问题还要持续定位,重启几分钟又呈现大量 error 就难堪了
  • 限流 重要接口要提前准备好限流配置,轻易能够动静更改接口 QPS
  • 线上回滚 如果前一天刚有上线动作,那十有八九就是上线导致的,这种状况如果问题临时没排查进去能够先回滚,而后组织一堆人去扒新提交的代码吧
  • 紧急扩容 首先服务必须是无状态的,反对动静扩大,而且瓶颈必须在应用服务,如果瓶颈在 DB 或者在别的中央也没方法

故障排查过程

后面说到如果前一天有上线,而后呈现故障回滚了,这种状况十有八九是回归测试不彻底,影响之前的逻辑了,最坏状况就是一堆人一行行去扒代码。当初咱们探讨的是如果生产服务变得很慢,error 告警一直减少的状况下怎么解决?

  • 服务监控 零碎高可用设计伎俩中很重要的一条就是 服务监控,零碎上线了不能裸奔,不然怎么死的都不晓得。安利一下美团开源的 CAT 监控零碎,CAT 能实时监控各个指标,各个链路事件。包含服务器的 CPU 负载,JVM 内存,GC 信息,线程信息,慢 URL,慢 SQL,申请响应耗时平均线、95 线、99 线,以及配置单位工夫内多少服务 error 告警等。

  • 故障排查命令 面试官常常喜爱问候选者线上故障有哪些排查命令,怎么去排查的。个别是先整体后部分的程序来排查

1. 查问整机 首先通过 top 命令查看整体状况,比拟重要的指标有 Load AVg,CPU usage,每个过程的 CPU 和 MEM。

也能够通过 uptime 查看精简版

2.CPU 通过 vmstat 工具查问 CPU 的状况,vmstat 蕴含两个参数,第一个参数是采样隔间工夫,然而是秒,第二个参数是采样次数。如:

vmstat -n 2 3 

示意每隔 2 秒采样一次,一共采样 3 次

  1. proces
  • r 运行和期待 CPU 工夫片的过程数
  • b 期待资源的过程数
  1. cpu
  • us 用户过程耗费 CPU 工夫百分比,如果长期大于 50%,可能存在 CPU 透露的危险,须要优化程序
  • sy 内核过程耗费 CPU 工夫百分比

3. 内存

free
free -g
free -m

个别应用程序可用内存 / 零碎物理内存 <20% 代表内存不足,须要减少内存

4. 硬盘

df -h

5. 磁盘 IO

iostat -xdk 2 3

大部分场景下如果零碎慢,一是 CPU 导致,还有一个就磁盘 IO。罕用的排查工具用 iostat,参数含意跟 vmstat 统一

6. 网络 IO

ifstat l

ifstat 命令如果不反对须要装置,能够查看各个网卡的 in,out;察看网络负载状况;网络状况是否正失常等

CPU 占用过高剖析思路

  • 先用 top 命令找出 CPU 占比最高的过程
  • 通过 ps -ef 命令或者 jps(java 过程)命令进一步定位这个占用 CPU 最高的过程是一个什么后台程序
  • 定位到具体线程
ps -mp 过程 ID -o THREAD,tid,time

- m 示意显示所有的线程,- p 过程应用 cpu 的工夫,- o 前面是自定义参数

  • 将定位进去的线程 ID 转换为 16 进制
printf "%x\n" 线程 ID
  • 定位到具体代码
jstat 过程 PID | grep 16 进制线程 tid 

以上排查过程读者能够在本地跑一个死循环的程序,跟着步骤 one by one 剖析一遍,必定会有所播种

零碎上线前的危险评估及应急计划

为了呈现故障时可能有条理的解决,当时必须有欠缺的筹备工作。

  • 系统监控,再次强调,线上零碎不能裸奔
  • 设置故障等级,阿里是依据影响用户量来定故障等级,不同的故障等级有不同的止血时效要求,规定工夫内没止血就会回升,触发更高级的流程
  • 故障演练,外围接口压测必不可少,像秒杀零碎,霎时大流量怎么解决,redis 挂了怎么解决,DB CPU 快打满了怎么解决,都要当时演练好,筹备好止血或者降级 job 或脚本

故障复盘

终于说到最外围的了,对程序员来说,每次线上事变踩坑都是一次大的成长,为了茁壮成长,预先复盘必不可少

常见的复盘流程三部曲

  • 故障处理过程,从发现故障到解决完故障具体记录几点几分别离干了什么事,把事变从产生到解决的所有细节记录下来
  • 故障起因剖析,阐明故障的起因和剖析报告,简略一点就是定事故责任人了
  • 后续整改 TODO

总结

故障排查过程就讲完了,你平时工作中碰到过哪些印象粗浅的故障,预先是怎么复盘的,欢送留言交换。笔者的一个共事说起在前东家的一个故障解决的趣事。中午零碎割接上线后,流量灰度切换过去后没过久零碎开始疯狂告警,而后一堆大佬坐着共事前面看着他解决故障,共事缓和的查询数据库 select 单词都敲不对。

感激关注

能够关注微信公众号「回滚吧代码」,第一工夫浏览,文章继续更新;专一 Java 源码、架构、算法和面试。

正文完
 0