使用 Systemtap 排查隐形 Killer

作者: siddontang | 来源:发表于2017-11-30 22:10 被阅读895次

昨天部署系统,准备重新测试一下 TiKV,不过令我比较吃惊的是,之前能顺畅跑出来的测试现在无论怎样都跑不出来,当时就吓出一身冷汗,觉得 TiKV 是不是最近有啥改动导致性能下降非常厉害。

翻了日志,发现每隔一分钟,TiKV 就收到了一个 signal 15 的信号,被 kill 掉了,如下:

2017/11/29 22:11:14.593 signal_handler.rs:68: [INFO] receive signal 15, stopping server...
2017/11/29 22:12:34.629 signal_handler.rs:68: [INFO] receive signal 15, stopping server...
2017/11/29 22:13:54.669 signal_handler.rs:68: [INFO] receive signal 15, stopping server...

但到底是谁干的呢?因为这台机器是公用的开发机器,上面有一些其他同学跑的进程,所以即使全部 ps 列出来,一个一个排查,这个时间也会比较久,幸好,我们有 systemtap。

首先写了一个 systemtap 脚本,给 signal kill 的处理加上 probe,直接从 systemtap 官网抄了一个例子:

probe nd_syscall.kill
{
    target[tid()] = uint_arg(1);
    signal[tid()] = uint_arg(2);
}

probe nd_syscall.kill.return
{
    if (target[tid()] != 0) {
        printf("%-6d %-12s %-5d %-6d %6d\n", pid(), execname(),
            signal[tid()], target[tid()], int_arg(1));
        delete target[tid()];
        delete signal[tid()];
    }
}

上面的脚本就是监控系统调用 kill 命令,毕竟你要 kill 进程,就得发送这个命令的,然后执行,看到了如下的输出:

118620 killall      15    118179    582
118620 killall      15    118180    582
118620 killall      15    118183    582

上面 118179 就是 TiKV 进程,也就是进程 118620 干了这个事情,于是立刻看这个进程,发现竟然不在了,也就是说,这个进程也是一个临时被启动的进程,干完了 kill 的事情,就功成身退了。于是,继续用上 systemtap,probe 进程的创建,仍然是从网上抄的代码:

probe kprocess.create
{
      printf("%-25s: %s (%d) created %d\n",
        ctime(gettimeofday_s()), execname(), pid(), new_pid)
}

probe kprocess.exec
{
      printf("%-25s: %s (%d) is exec'ing %s\n",
        ctime(gettimeofday_s()), execname(), pid(), filename)
}

跟之前的 systemtap 脚本放在一起跑,发现:

Wed Nov 29 15:16:36 2017 : bash (117037) created 138912
Wed Nov 29 15:16:36 2017 : bash (138912) is exec’ing “/usr/bin/killall”
138912 killall      15    138108    582
138912 killall      15    138109    582
138912 killall      15    138112    582

上面清楚的说明有一个 bash 进程 117037 创建了一个子进程 138912,然后这个进程执行了 killall,干掉了所有的 TiKV,于是看进程,找到对应的脚本,发现里面赫然干了一件事情:

for t in  $(seq 1000000); do
      killall tikv-server
      sleep 80s
done;

原来是一个同事之前测试 TiKV 的时候,想通过定期的 kill TiKV 发现一些问题,结果他忘记结束这个测试脚本了,于是我再用这台机器的时候就悲催了。

这次问题排查通过 systemtap 很快就定位了问题,现在越来越觉得 systemtap 是一个非常强大的工具,后面需要多多学习,多尝试在系统曾名用系统工具,譬如 systemtap,eBPF 等来解决问题。

相关文章

  • 使用 Systemtap 排查隐形 Killer

    昨天部署系统,准备重新测试一下 TiKV,不过令我比较吃惊的是,之前能顺畅跑出来的测试现在无论怎样都跑不出来,当时...

  • stap环境搭建

    使用systemtap之前,要现安装systemtap,我用的是ubuntu16.04,内核Linux ubu...

  • 使用 Fuse 来进行 I/O 错误注入

    在之前介绍 SystemTap 的文章中,我提到了我们使用 SystemTap 做了很多 I/O 错误注入的工作,...

  • 火焰图生成

    上篇介绍了systemtap的使用。承接上篇,这篇接着纪录后续,用systemtap统计了信息,如何更加直观的观察...

  • centos 7 systemtap 安装

    1,安装systemtap和kernel-devel包 yum install systemtap kernel-...

  • systemtap使用笔记

    安装 使用之前需要安装一些内核调试包安装systemtap 可以用这个命令看下需要的包 正常的安装流程.假设之前相...

  • SystemTap工具的使用基础

    systemtap工具的安装 准备工作 uname -a 查看当前内核版本是哪一个,然后使用 yum instal...

  • 使用systemtap调试软件技巧

    技巧一 获取函数运行时间。编写协议类的软件,很多问题往往和某个函数体的运行时间有关,获取耗时长的函数,往往是解决问...

  • systemtap

    内核调试

  • oom-killer, 杀掉进程的凶手

    今天发现进程一直被杀掉,几经排查,最后确认是被oom-killer杀掉了。 在内核检测到系统内存不足后,会触发oo...

网友评论

    本文标题:使用 Systemtap 排查隐形 Killer

    本文链接:https://www.haomeiwen.com/subject/kfibbxtx.html