Core Dump 是什么?

Core Dump 是指进程异常退出时,操作系统将进程的内存状态保存到文件中,这个文件就是 Core Dump 文件,中文一般翻译为“核心转储”,哈,看起来还不如不翻译。

我们可以认为 Core Dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。

Core Dump 有什么用?

一个是用于排查问题,例如程序 crash 了,我们可以通过 gdb 等工具来分析 core dump 文件,找到问题的原因。另一个是监控,我们可以通过监控手段及时发现程序 crash 了,及时处理。

程序自身产生的 Core Dump 文件一般可以用来分析程序运行到哪里出错了。

Linux 平台常用的 coredump 文件分析工具是 gdb;Solaris 平台用 pstack 和 pflags;Windows 平台用 userdump 和 windbg。

测试生成 Core Dump 文件

[root@VM-0-33-debian:~# cd /home/user
[root@VM-0-33-debian:~# ulimit -c unlimited
[root@VM-0-33-debian:~# kill -s SIGSEGV $$

这将会在你当前的 shell 下触发一个段错误,进而生成一个 core dump 文件,文件名为 core 或 core.pid,pid 是当前 shell 的进程号。

注意,ulimit -c unlimited 是告诉操作系统,不要限制 core dump 文件的大小,如果你执行 ulimit -c 看到输出 0,就表示 core dump 文件大小限制为 0 了,也就不会生成。比如我的机器环境:

[root@VM-0-33-debian:~# ulimit -a
real-time non-blocking time (microseconds, -R) unlimited
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 30148
max locked memory (kbytes, -l) 969535
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 30148
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

注意 core file size 那一行,我的环境是 0,就表示限制了 core dump 文件的生成。

Core Dump 文件路径定义

在 Linux 下,core dump 文件的路径是由 /proc/sys/kernel/core_pattern 定义的,如果这个文件不存在,或者内容为空,那么 core dump 文件就会生成在当前目录下。

[root@VM-0-33-debian:~# cat /proc/sys/kernel/core_pattern
core

上面的输出表示,core dump 文件会生成在当前目录下,文件名为 core。

我们可以通过修改 /proc/sys/kernel/core_pattern 来定义 core dump 文件的路径和文件名,例如:

[root@VM-0-33-debian:~# mkdir -p /tmp/cores
[root@VM-0-33-debian:~# chmod a+rwx /tmp/cores
[root@VM-0-33-debian:~# echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

然后,我们重新生成 core dump 文件:

[root@VM-0-33-debian:~# cd /home/user
[root@VM-0-33-debian:~# ulimit -c unlimited
[root@VM-0-33-debian:~# kill -s SIGSEGV $$

此时,我们会生成一个类似这样的文件:/tmp/cores/core.bash.8539.VM-0-33-debian.1236975953。其中,bash 是进程名,8539 是进程号,VM-0-33-debian 是主机名,1236975953 是时间戳。文件存储在 /tmp/cores 目录下。

对于 core_pattern 的定义,可以使用如下的占位符:

%p: pid
%: '%' is dropped
%%: output one '%'
%u: uid
%g: gid
%s: signal number
%t: UNIX time of dump
%h: hostname
%e: executable filename
%: both are dropped

其中,%h hostname 最好加上,假如我们把 core dump 文件存放在 NFS 上,就可以用 %h 来区分 core dump 文件来自哪个机器了。

echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern 这种设置方式,是临时生效,如果机器重启,就会失效。如果想要永久生效,可以修改 /etc/sysctl.conf 文件,添加一行:

# Own core file pattern...
kernel.core_pattern=/tmp/cores/core.%e.%p.%h.%t

然后执行 sysctl -p 命令,使配置生效。

Core Dump 文件监控

一般来讲,对于规范化做的好的公司,core_pattern 是系统部交付机器的时候,统一设置好的,公司所有的机器的 core_pattern 都是一致的,会设置成一个统一的目录,例如 /opt/cores,这样就可以方便地对 core dump 新文件进行监控了。

这里,推荐大家使用 catpaw(基本介绍参考这里:太卷了,史上最简单的监控系统 catpaw 简介),catpaw 从 v0.3.0 版本开始,引入了 mtime 监控插件,可以监控近期的文件变更,进而监控新的 core dump 文件的产生。

mtime 插件的配置如下:

[[instances]]
time_span = "3m"
directory = "/opt/cores"
check = "file changed or created"
interval = "30s" [instances.alerting]
## Enable alerting or not
enabled = true
## Same functionality as Prometheus keyword 'for'
for_duration = 0
## Minimum interval duration between notifications
repeat_interval = "5m"
## Maximum number of notifications
repeat_number = 3
## Whether notify recovery event
recovery_notification = true
## Choice: Critical, Warning, Info
default_severity = "Warning"

上面的意思表示,每 30s 探测一次,每次探测最近 3 分钟内是否有文件变更或新文件产生。比如我随便对某个目录做了测试,最终输出的内容长这个样子:

总结

希望本文介绍的内容对你有帮助,愿不吝点赞、在看。如果有其他这类事件监控的场景需求,也可以联系我,后面都会一并做到 catpaw 里。

虽然 FlashDuty 有免费套餐,如果就是不想用,也可以模仿 FlashDuty 的事件接收接口自己搞个 HTTP Server,接收 catpaw 的事件推送,然后自己处理,比如发送到钉钉、飞书、邮件等。

enjoy...make a better world

core dump 路径定义以及监控的更多相关文章

  1. 使用GDB 追踪依赖poco的so程序,core dump文件分析.

    前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...

  2. gdb调试常用实用命令和core dump文件的生成

      1.生成core dump文件的方法: $  ulimit -c //查看是否为0 如果为0 $   ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxx ...

  3. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

  4. 段错误调试神器 - Core Dump详解

    一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...

  5. 关于内核转储(core dump)的设置方法

    原作者:http://blog.csdn.net/wj_j2ee/article/details/7161586 1. 内核转储作用 (1) 内核转储的最大好处是能够保存问题发生时的状态. (2) 只 ...

  6. gdb调试常用实用命令和core dump文件的生成(转)

    1.生成core dump文件的方法: $  ulimit -c //查看是否为0 如果为0 $   ulimit -c unlimited 这样在程序崩溃以后会在当前目录生成一个core.xxxx的 ...

  7. Core Dump 程序故障分析

    1.编写一个应用程序,使用gdb+core dump进行故障分析, core dump的概念: core dump又叫核心转存:当程序在运行过程中发生异常,这时Linux系统可以把程序在运行时的内存内 ...

  8. Linux core dump使用

    什么是 core dump? core dump是一个当进程意外终止时包含进程内存内容的文件.当程序崩溃的时候,core dump由kernel触发.core dump可以作为程序崩溃时的事后快照(p ...

  9. Linux Core Dump

    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”).我们可以认为 core dump 是“内存快 ...

  10. core dump 是什么意思?

    core dump,翻译过来讲,就是核心转储.大致上就是指,如果由于应用错误,如浮点异常.指令异常等,操作系统将会转入内核的异常处理,向对应的进程发送特定的信号(SIGNAL),如果进程中没有对这些信 ...

随机推荐

  1. 阿里云 VPC 内网性能测试最佳实践

    ​简介:本文介绍了在阿里云 VPC 内网执行性能测试的方法.相较于传统的公网性能测试,VPC 内网性能测试完全在客户 VPC 环境进行,无需暴露服务到公网,安全性更高,灵活性更强. 作者:风起 背景 ...

  2. RocketMQ 端云一体化设计与实践

    简介:本文首先介绍了端云消息场景一体化的背景,然后重点分析了终端消息场景特点,以及终端消息场景支撑模型,最后对架构和存储内核进行了阐述.我们期望基于 RocketMQ 统一内核一体化支持终端和服务端不 ...

  3. 为了让你在“口袋奇兵”聊遍全球,Serverless 做了什么?

    简介: 江娱互动是一家新兴的游戏企业,自 2018 年成立伊始,江娱互动就面向广阔的全球游戏市场,通过创造有趣的游戏体验,在竞争激烈的游戏市场占得一席之地.仅仅 2 年的时间,江娱互动就凭借 Topw ...

  4. 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

    简介: 本文将对 RocketMQ-Exporter 的设计实现做一个简单的介绍,读者可通过本文了解到 RocketMQ-Exporter 的实现过程,以及通过 RocketMQ-Exporter 来 ...

  5. 解密万亿参数M6模型预训练背后的分布式框架Whale

    ​简介: 最近,阿里云PAI团队和达摩院智能计算实验室一起发布"低碳版"巨模型M6,大幅降低万亿参数超大模型训练能耗.借助我们自研的Whale框架仅使用480卡GPU,即训练出了规 ...

  6. Apache Flink 在京东的实践与优化

    ​简介: Flink 助力京东实时计算平台朝着批流一体的方向演进. 本文整理自京东高级技术专家付海涛在 Flink Forward Asia 2020 分享的议题<Apache Flink 在京 ...

  7. RT-Thread线程管理

    一.概述 这是我学习RT-Thread线程管理过程中记录的笔记,方便自己查看,仅供参考,有什么不对的地方忘各位大佬指出.想要了解更详细的内容,请浏览官方文档"线程管理" 如下图所示 ...

  8. C语言程序设计-笔记04-函数

    C语言程序设计-笔记04-函数 例5-1  计算圆柱体的体积.输入圆柱的高和半径,求圆柱体积volume=πxr^2xh.要求定义和调用函数cylinder(r,h)计算圆柱体的体积. #includ ...

  9. ansible(12)--ansible的cron模块

    1. cron模块 功能:管理被控端计划任务: 主要参数如下: 参数 说明 name 定时任务基本描述 job 定时任务要执行的命令 minute 分 hour 小时 day 日 month 月 we ...

  10. cesium介绍和国内主要学习网站汇总

    Cesium官方网站 建议大家将Cesium官网的博客都读一遍,博客大概分为三类,主要是技术类,比如性能优化,调度算法等,一类是定期的新版本特性,能够了解Cesium新功能和新特性,还有一类是大事记, ...