关于OOM故障复盘

故障背景

    在业务高峰时期,出现io告警和内存告警,应用程序挂掉,从而导致业务中断。

    业务中断如何定义?对于现在的应用来说,都是高可用的,那么意味着挂了一个其实没什么关系,就像人员的主备,好像暂时还没出现人员的双活情况,双活可能导致的问题就是心跳不同步,信息不到位,从而导致脑裂。

    业务中断的定义:请求的成功数量/总的请求的数量,从而定义一个服务水平。或许服务水平也可以这样来定义,一定不要满足客户百分百的请求,因为很多都是无理的请求,当然,这样导致的后果就是。。。死的很惨。。。追求完美,不可能的。。

故障处理过程

    1 描述故障,发布通告

    在故障发生的那一刻,惊慌失措是正常的,但是这个时候,依旧要描述目前的影响范围,并且描述清楚目前出现的各种现象,可能这个现象是对的,可能这个现象是错误的。

    在故障发生的那一刻,技术人员的本能是什么?查看日志,追踪服务报错,查看报警看看哪里有问题,一头扎入各种问题的细节之处,等到发现无法解决的时候,时间已经过去了一半。

    在关键时刻,抵制本能。。。人的生活也是这样,在出现烦心事的时候,第一时间就开始抱怨,忍住,不要浪。。。

    我们要做的是,发布故障,联系相关团队加入,在每个团队加入的时候,告诉他们故障的现象,可能存在什么样的问题,他们负责哪一块的问题。。。明确每个人需要协助的方面

    如果不停的有团队加入,加入的时候信息不同步,那么新加入的人肯定一头雾水,WTF,我来干啥?我能做啥?需要我帮你干啥。。。弄啥嘞

    2 排除故障的方法

    故障可能出现在每一个方面,如果我们不曾测试过。。。如果测试过,那么很多故障能提前避免。

    关联性的故障是最难排查的,因为出现的问题是千丝万缕的。

    排除故障的方法一般就几种:

    a 统计法

        应用程序平稳运行了几个月,突然之间挂掉,查看监控,将时间周期放长,看看这一段时间是否有业务峰值。

        从不同的角度来查看监控,查看服务器的cpu,内存,io,网络流量,有的时候只有单一的因素,有的时候则有各种相关的同时发生,例如出现OOM的时候,同时出现了io和内存的告警,从而可以从这两个方向进行排查。

    b 对比法

        对于应用程序来说,一般都有两个后端,后端都是负载均衡的,所以如果是一个挂了的话,那么就可以使用对比法,对比两个服务器的使用的资源消耗,从而看看哪个方面的数据不正常。

    c 查日志

        从应用程序角度查看应用的日志,看看是否出现相关的报错,看看是否出现内存剧增,看看是否出现oom的日志。

        从操作系统层面,查看系统日志message,查看内核日志dmesg,查看top看看性能,查查history看看是否有相关的审计。

        从应用程序的链路查看相关日志,这个服务正常,下游的服务呢,服务的追踪链条,就像有一个人错了,从而导致这一条线全错了。

    d 查原理

        如果是内存OOM了,那么哪些进程使用了超级多的内存?为什么使用了那么多的内存?如果内存消耗都是正常,那么是否应该考虑扩容,本身的资源不足导致的?

        IO出现告警,为什么会出现IO告警?是因为应用的业务高峰,导致疯狂的读写文件导致?还是因为在读取远程的文件,而导致io在进行排队请求?

    e 查操作

        在出现的问题的那一刻,所有的操作都值得查证,是因为一些平时看起来没问题的操作导致的?因量变而导致的质变,例如平时打开一个文件没啥关系,打开一个10G的文件实施;还是程序里面打开了一个文件,平时文件很小的时候没出现问题,当打开一个10G的文件的时候,OOM了?

    此时此刻,谁在干什么,程序在干什么。。。我是谁,我在哪里,我在干什么。

    f 查争抢

        无论在做什么,总是会出现争抢,毕竟底层的资源是有限的,一台物理机上面运行了10个虚拟机,一个物理机上面运行了100个容器,一个人喝了好几杯奶茶。

        一个池子,一个人捣蛋,那么所有在这个池子里面的都会受到影响。。。想一想一台物理机上运行10个mysql的实例,一个mysql的sql不规范,全局都受到影响

        3 改进措施

        a 运维不规范,行人两行泪。。。内部同步运维规范,用处不是很大,因为故障报告没有存档,没有人阐述整体的背景经过,新来一个,依旧会踩坑。。。每个人都很忙,谁有那么多时间。。。新手模拟故障,处理故障,运维规范。

        b 故障描述清楚,联系合适的人处理合适的问题,无论是开发,运维,管理,故障升级,是一种共同责任。。。一条线上的蚂蚁

        c 当不知道问题出在哪儿的时候,全部上来查,先证明自己负责的没问题。。。同步排查,有信息进行同步,减少故障的处理时长。

    4 内存相关

    无论是故障的处理,还是一个告警的处理,还是一个问题的处理,都是无限的追问为什么的过程。。。为什么你是个傻逼?这样的追问才能找到最后的本质原因。。。

    错误预算。。。很多时候,基本上没有错误预算,虽然很多时候我们标注了风险,但是一般标注了的风险都是考虑到了的部分,实际上都可以通过各种方法解决;但是,没有考虑到的方面呢?这些潜在的风险谁来protect你?

    潜在的风险就是一种错误预算,这是一种共同的责任,而不是某个单独的人来抗。。。在创新的同时,要容忍错误,但是不在同一个问题上犯错误。

    今日最好的表现,是明天最低的要求。这就是变化

    屁能力没有,还TM天天搞事情,还TM天天装逼。。。啊呸呸。。。

发布了188 篇原创文章 · 获赞 424 · 访问量 43万+

猜你喜欢

转载自blog.csdn.net/TM6zNf87MDG7Bo/article/details/103231463