【作者】

王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣。

【问题描述】

最近我们有多台MongoDB的服务器CentOS 7.1系统发生了crash,会不定期的自动重启。

【排查思路】

1、碰到linux系统crash的问题,我们首先想到的是排查系统日志/var/log/message,看是否有硬件问题或其他原因。抽查了多台服务器在crash的时间点message中都没有记录异常信息。

2、对于CentOS 7的系统,我们可以使用journalctl工具查看内核以及服务等产生的日志信息,检查相关日志只记录发生过reboot,没有其他异常信息。

3、 一般linux系统都默认配置了kdump,kdump是基于kexec的内核崩溃转储机制,可以转储内核崩溃时的内存镜像。在其中一台服务器上我们在/var/crash/127.0.0.1-2018.12.26-00:31:04目录下找到了转储文件vmcore。

【排障过程】

1、 为了避免对生产环境造成影响,我们将vmcore文件拷贝到内核版本相同的一台测试服务器上

2、 使用crash工具分析vmcore文件,在测试服务器上先安装crash工具:

yum install crash

3、 安装debuginfo包,可以在官网上下载对应kernel版本的debuginfo包:

https://buildlogs.centos.org/c7.1511.u/kernel/20161024152721/3.10.0-327.36.3.el7.x86_64/

安装依赖包及debuginfo包:

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

4、使用crash工具分析/var/crash下的转储文件vmcore,命令如下:

crash /usr/lib/debug/lib/modules/3.10.0-327.36.3.el7.x86_64/vmlinux vmcore

5、可以看到kernel crash时的Call Trace,关键信息见黄色背景字体:

crash> bt
PID: 9979 TASK: ffff8804b4020b80 CPU: 2 COMMAND: "crond"
\#0 [ffff8804b42db778] machine_kexec at ffffffff81051e9b
\#1 [ffff8804b42db7d8] crash_kexec at ffffffff810f27e2
\#2 [ffff8804b42db8a8] oops_end at ffffffff8163f448
\#3 [ffff8804b42db8d0] no_context at ffffffff8162f561
\#4 [ffff8804b42db920] __bad_area_nosemaphore at ffffffff8162f5f7
\#5 [ffff8804b42db968] bad_area at ffffffff8162f91b
\#6 [ffff8804b42db990] __do_page_fault at ffffffff81642235
\#7 [ffff8804b42db9f0] trace_do_page_fault at ffffffff81642403
\#8 [ffff8804b42dba28] do_async_page_fault at ffffffff81641ae9
\#9 [ffff8804b42dba40] async_page_fault at ffffffff8163e678
[exception RIP: netlink_compare+11]
RIP: ffffffff815560bb RSP: ffff8804b42dbaf8 RFLAGS: 00010246
RAX: 0000000000000000 RBX: 000000049f250000 RCX: 00000000c3637c42
RDX: 00000000000026fb RSI: ffff8804b42dbb48 RDI: 000000049f24fb78
RBP: ffff8804b42dbb30 R8: ffff8804b42dbb44 R9: 0000000000002170
R10: 0000000000000000 R11: ffff8804b42db966 R12: ffff88061dcd2678
R13: ffff8804b42dbb48 R14: ffffffff815560b0 R15: ffff88061b639000
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
\#10 [ffff8804b42dbb00] rhashtable_lookup_compare at ffffffff813080d0
\#11 [ffff8804b42dbb38] netlink_lookup at ffffffff815569ee
\#12 [ffff8804b42dbb68] netlink_getsockbyportid at ffffffff81557d8f
\#13 [ffff8804b42dbb80] netlink_alloc_skb at ffffffff81557dff
\#14 [ffff8804b42dbbb8] netlink_ack at ffffffff8155a8a9
\#15 [ffff8804b42dbbf0] audit_receive at ffffffff811067e7
\#16 [ffff8804b42dbc18] netlink_unicast at ffffffff8155a02d
\#17 [ffff8804b42dbc60] netlink_sendmsg at ffffffff8155a420
\#18 [ffff8804b42dbcf8] sock_sendmsg at ffffffff815112d0
\#19 [ffff8804b42dbe58] SYSC_sendto at ffffffff81511841
\#20 [ffff8804b42dbf70] sys_sendto at ffffffff815122ce
\#21 [ffff8804b42dbf80] system_call_fastpath at ffffffff81646b49
RIP: 00007f4ac19d5353 RSP: 00007ffe233b1fb8 RFLAGS: 00010202
RAX: 000000000000002c RBX: ffffffff81646b49 RCX: 0000000000000000
RDX: 000000000000009c RSI: 00007ffe233b1ff0 RDI: 0000000000000003
RBP: 00007ffe233b1ff0 R8: 00007ffe233b1fe0 R9: 000000000000000c
R10: 0000000000000000 R11: 0000000000000246 R12: ffffffff815122ce
R13: ffff8804b42dbf78 R14: 000000000000044d R15: 0000000000000001
ORIG_RAX: 000000000000002c CS: 0033 SS: 002b

6、搜索rhashtable_lookup_compare关键字,定位到这是kernel Linux 3.10.0-327.36.3.el7.x86_64的一个bug,详细描述可以参见下面,该bug在 7.3 kernel (3.10.0-514.el7)后修复:

https://bugs.centos.org/view.php?id=12012

【定位bug触发条件】

1、考虑到升级系统成本较高,尝试定位触发bug的条件,可以看到触发这个bug是crond命令:

PID: 9979   TASK: ffff8804b4020b80  CPU: 2   COMMAND: "crond"

2、借助systemtap工具,在发生crash的kernel函数上加探针,并打印kernel backtrace,process id,process name等信息,脚本如下:

probe kernel.function("rhashtable_lookup_compare") {
print_backtrace();
printf ("%d\n%s\n", pid(),execname());
}

3、抓取到crond等系统命令确实会调用rhashtable_lookup_compare函数,而其他命令的调用堆栈并不完全相同:

25756
crond
0xffffffff81308080 : rhashtable_lookup_compare+0x0/0x90 [kernel]
0xffffffff815569ee : netlink_lookup+0x4e/0x80 [kernel]
0xffffffff81557d8f : netlink_getsockbyportid+0x1f/0x70 [kernel]
0xffffffff81559fe9 : netlink_unicast+0xa9/0x1b0 [kernel]
0xffffffff8155a8f9 : netlink_ack+0x99/0x110 [kernel]
0xffffffff811067e7 : audit_receive+0x67/0xa0 [kernel]
0xffffffff8155a02d : netlink_unicast+0xed/0x1b0 [kernel]
0xffffffff8155a420 : netlink_sendmsg+0x330/0x770 [kernel]
0xffffffff815112d0 : sock_sendmsg+0xb0/0xf0 [kernel]
0xffffffff81511841 : SYSC_sendto+0x121/0x1c0 [kernel]
0xffffffff815122ce : SyS_sendto+0xe/0x10 [kernel]
0xffffffff81646b49 : system_call_fastpath+0x16/0x1b [kernel]

4、考虑到MongoDB最近新上了一套监控的脚本是通过crontab调度的,而上监控之前服务器重启的情况很少。猜测可能是crontab调度系统监控程序触发了kernel bug,后面将监控脚本改为服务的方式观察是否可以规避触发bug。

【解决思路】

我们通过分析kernel crash时的转储文件,定位到CentOS 7.1系统存在自动重启的bug,建议新的linux服务器都采用CentOS 7.4的系统。

考虑到升级系统成本较高,将crontab调度的程序改为服务的方式,来尝试规避触发bug。

MongoDB系统CentOS 7.1 crash的排障过程的更多相关文章

  1. 【原创】记一次MySQL大表高并发写入引发CPU飙升的排障过程

    目录 一.故障现象... 1 二.初步分析... 2 三.排障过程... 2 1.排查是否QPS或insert并发请求上升导致问题发生... 2 2.排查是否锁资源等待或block导致了insert变 ...

  2. 如何进行kubernetes问题的排障

    排障的前置条件 k8s的成熟度很高,伴随着整个项目的扩增,以及新功能和新流程的不断引入,也伴随这产生了一些问题.虽然自动化测试可以排除掉大部分,但是一些复杂流程以及极端情况却很难做到bug的完全覆盖. ...

  3. 使用Fragment应用放置后台很久,被系统回收,出现crash

    使用Fragment应用放置后台很久,被系统回收,出现crash:原因:系统做了源码FragmentActivity调用onSaveInstanceState保存Fragment对象,这时候系统恢复保 ...

  4. VMware 安装Linux系统 CentOS

    VMware 安装Linux系统 CentOS 1.  下载镜像系统 centos镜像下载地址:https://www.centos.org/download/ 选择DVD下载即可 linux各版本下 ...

  5. linux系统Centos环境下搭建SVN服务器及权限配置

    linux系统Centos环境下如何搭建SVN服务器以及svnserve.conf.authz.passwd配置文件详细介绍   至于svn的概念,这里就不做详细阐述了,可以自行百度.简单来讲就是一个 ...

  6. 系统之锹sysdig:Linux服务器监控和排障利器

    当你需要追踪某个进程产生和接收的系统调用时,首先浮现在你脑海中的是什么?你可能会想到strace,那么你是对的.你会使用什么样的命令行工具来监控原始网络通信呢?如果你想到了tcpdump,你又作出了一 ...

  7. U盘永久系统-centos

    U盘永久系统-centos 问题: 服务器centos系统崩溃,重装需要备份其中数据,约4T,实验室有远程存储服务器,然而rescue模式进去后无法挂载远程存储,只好做一个真正的U盘系统解决了. 方案 ...

  8. How To Install MongoDB on CentOS 6

    How To Install MongoDB on CentOS 6 Posted on January 21, 2014 by J. Mays | Updated: January 22, 2014 ...

  9. 其他综合-Kickstart无人值守安装系统CentOS 7

    Kickstart无人值守安装系统CentOS 7 1.概述 1.1 关于PXE Preboot Execution Environment 翻译过来就是预启动执行环境:简称 PXE :传统安装操作系 ...

随机推荐

  1. PTA第五次作业

    #include<stdio.h> #include<math.h> int main () { int n,m,i,j,a; scanf("%d",&am ...

  2. MyEclipse配置Maven插件

    一.工具环境 1.jdk-7u80-windows-x64 2.apache-tomcat-7.0.70 3.apache-maven-3.3.9 4.MyEclipse 10.7 5.windows ...

  3. 2018.09.20 atcoder Painting Graphs with AtCoDeer(tarjan+polya)

    传送门 一道思维题. 如果没有环那么对答案有k的贡献. 如果恰为一个环,可以用polya求贡献. 如果是一个有多个环重叠的双联通的话,直接转化为组合数问题(可以证明只要每种颜色被选取的次数相同一定可以 ...

  4. 2018.09.08 poj1185 炮兵阵地(状压dp)

    传送门 状压dp经典题. 我们把每一行的状态压成01串. 预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了. 注意当前行转移要考虑前两行的状态. 还要注意只有一行的情况. 代码: ...

  5. 2018.08.12 bzoj5301: [Cqoi2018]异或序列(前缀和+莫队)

    传送门 简单的异或前缀和处理+莫队统计答案. 惊奇的发现无论开不开long long都能跑过... 代码: #include<bits/stdc++.h> #define N 100005 ...

  6. 2018.07.23 洛谷P4513 小白逛公园(线段树)

    传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...

  7. 使用bat批处理文件备份mysql数据库

    @echo offset date_string=%date:~0,4%_%date:~5,2%_%date:~8,2%  //日期set time_string=%time:~0,2%_%time: ...

  8. 山东省第七届ACM竞赛 J题 Execution of Paladin (题意啊)

    题意:鱼人是炉石里的一支强大种族,在探险者协会里,圣骑士有了一张新牌,叫亡者归来,效果是召唤本轮游戏中7个已死鱼人.如果死掉的不足7个,那么召唤的数量就会不足7. 鱼人有很多,下面的4个是: 寒光智者 ...

  9. c# Clipboard.SetDataObject(bmp1) 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常

    c# Clipboard.SetDataObject(bmp1)  在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttri ...

  10. yum 常用命令

    yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系.在建立好yum服务器后,yum客户端可以通过 http.ftp方式获得软件包,并使用方便的命令直接管理. ...