记录一次Centos7宕机事件

事件背景

2020年9月25日18点18分,收到告警,大数据02节点宕机,发现此问题出现过3次,分别在生成大数据服务器的2个节点上发生。这次决心要查处问题。

服务是CDH节点,就是大数据那一套东西。

系统版本:CentOS Linux release 7.3.1611

内核版本:3.10.0-514.el7.x86_64

服务器厂商:Dell R730

故障分析

 服务器宕机主要有3条分析思路。

  • 是否内存或者CPU爆满,导致服务器OOM,导致服务器重启
  • 是否硬件导致重启
  • 是否触发系统BUG

本着这3条思路,我们接下来分头排查。

  • 观察系统日志(/var/log/messages、/var/log/dmesg)
  • 登录管理卡地址,查看是否有硬件告警,并收集硬件信息,报告厂商协助排查
  • 检查是否是系统内核bug导致,所以得看kdump在系统崩溃保留的信息

分析过程:

1、登录服务器查看系统日志

 

 

 上图是日志估值发生时候的日志,我们可以看出,这里只是故障发生后的服务器启动日志,故障发生时并没留下什么蛛丝马迹。所以这里并没有可用的信息,可以忽略。

 

2、硬件检测

  DELL厂商回复,硬件一切正常,没有故障

3、我们分析一下系统崩溃时候kdump给我们留下来的信息。

什么是kdump

kdump 可以说是服务器的黑匣子,是一种的基于 kexec 的内核崩溃转储机制。系统一但崩溃,内核无法正常记录信息了,这时kdump将转入带第二个捕获内核,将第二个内核加载的内存中,对第一个内核的信息进行捕获。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。kexec是一个快速启动机制,可以通过已经运行的内核,启动另外一个内核并且不需要经过bios。

安装启动kdump,我们这里是默认启动的

 

 

 安装crash命令和kdump相关工具,分析数据

yum install crash -y 

下载

wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64.rpm
wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-514.el7.x86_64.rpm

安装

rpm -ivh  kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64.rpm kernel-debuginfo-3.10.0-514.el7.x86_64.rpm

crash解析奔溃日志

在发生故障的时候会在/var/crash/生产一个主机+故障时间目录,并产生两个文件vmcore  vmcore-dmesg.txt

vmcore-dmesg.txt 记录的是粗略的信息。主要能分析出两个问题:

错误类型:

例如:

divide error、BUG之类的关键词

错误地点:

RIP为造成内核崩溃的指令,Call Trace为函数调用栈,通过RIP和Call Trace可以确定函数的调用路径,以及在哪个函数中的哪条指令引发了错误。

例如本次错误是RIP: 0010:[<ffffffffa03742fb>]  [<ffffffffa03742fb>] xfs_vm_writepage+0x58b/0x5d0 [xfs]

<ffffffffa03742fb>  <ffffffffa03742fb> 是指内存地址

xfs_vm_writepage 是错误函数

Call Trace为函数的调用栈,是从下往上看的。可以用来分析函数的调用关系。

本次故障是通过vmcore-dmesg.txt文件观察到的,错误信息如下:

 

 

 我们还可以使用vmcore解析出详细日志,并进入当时的内核,查看一些当时的情况,具体可以查看此链接https://www.bladewan.com/2017/09/21/kdump/

这时候我们找到的问题,接下来是解决或者是怎么防止故障了,我们谷歌搜索一下kernel BUG at fs/xfs/xfs_aops.c:1062!,可以看到红帽的官方文章https://access.redhat.com/solutions/2779111。或者https://blog.51cto.com/jiaxiaolei/2140212

通过文章我们可以得知是内核BUG,起因是JAVA的JVM的“hsperf”内存映射可写“hsperfdata”文件

解决办法:

升级内核3.10.0-693以上。但有的环境升级内核不方便,同时应用是java应用,可以使用临时方法jvm 中关闭hsperf的特性。

 

参考链接:

https://blog.51cto.com/jiaxiaolei/2140212

https://www.bladewan.com/2017/09/21/kdump/

 

posted @ 2020-09-27 18:31  大胖猴  阅读(7029)  评论(0编辑  收藏  举报