Coredump 分析能力

本文介绍 Node.js 性能平台的 Coredump 分析能力。

概述

当我们的应用意外崩溃终止时,计算机会自动记录下进程 crash 掉那一刻的内存分配信息、program counter 以及堆栈指针等关键信息来生成 Coredump 文件,因此获取到 Coredump 文件后,我们通过 mdb、gdb、lldb 等工具即可实现解析诊断实际进程的 crash 原因。

换言之,依赖 Coredump 文件,我们可以更好地去还原应用故障现场来定位问题。因此 Node.js 性能平台提供了针对服务器上 Node.js 应用生成的 Coredump 文件的 文件生成告警自动保存一键转储 (commandx >= v1.5.2) 和 智能化分析 的功能;与此同时,也支持开发者手动上传 Coredump 文件来进行分析。

文件生成告警

由于用户开启 ulimit -c unlimited 限制后,Node.js 进程 crash 时会自动生成一份 Coredump 文件,此时用户是无感知的,因此我们增加了对异常生成 Coredump 文件的告警支持。

进入您的应用 报警 页,进行如下设置后即可添加 Coredump 文件告警:

coredump

需要注意的是,类型必须选择 coredump,阈值表达式则填写 @coredumps > 0,其余选项根据您的需要进行选择即可,最后点击 添加报警项 即可。

自动保存

服务器 Node.js 应用生成的 Coredump 文件路径会被 agenthub 自动上报并保存记录,我们默认会扫描 Node.js 应用的 pwd 目录(应用工作目录),您也可以通过给 agenthub 的启动配置文件加上 coredir 的配置项来自定义需要扫描 Coredump 文件的目录,如下面的例子:

{
 "appid": "xxx",
 "secret": "xxxxxx",
 "coredir": ["/home/alinode/test"]
}

coredir 对应的值是一个数组,因此您可以配置多个目录。上面例子中配置完成后启动 agenthub,则它除了会扫描 Node.js 应用的 pwd 目录外还会去扫描 /home/alinode/test 目录下的 core 文件。

想要查看自动上报的记录,您可以进入 Node.js 性能平台应用页,然后将鼠标悬浮于应用页面左侧边栏的 文件 按钮上,如下图所示:

file

接着选择 Coredump 文件,即可看到 Coredump 文件记录:

coredump-list

注意:自动上报只会上报新生成的 Coredump 文件,历史文件不会上报;并且所有未转储的记录只会保留一周。

一键转储

如果您想对上述的 Coredump 文件进行分析,首先需要将服务器上的文件转出至云端,因为分析需要传入 node 可执行文件,所以这里首先需要填写下生成这份 Coredump 文件的 Node.js 应用被启动时 runtime 的版本。

注意:转储功能需要您的 agenthub/egg-alinode 依赖的 commandx 版本 >= v1.5.2,否则会转储失败

设置 runtime 版本

点击 设置 runtime 版本 进行设置,如下图所示:

set-runtime

runtime 的版本设置格式为 alinode-vA.B.C 或者 node-vA.B.C,比如:alinode-v3.11.5,如下图所示:

save

点击保存即可,请务必确保设置的 runtime 版本和真实启动应用的版本是一致的。

转储 Coredump 文件

设置完 runtime 版本后,点击 转储 按钮即可将服务器上对应的 Coredump 文件转储至云端,如下图所示:

transfer

智能分析

Coredump 文件转储成功后,点击 分析 按钮即可进行智能化分析,更多详细内容可以参考:Node 案发现场揭秘 —— Coredump 还原线上异常

手动上传

除了服务器上生成的 Coredump 文件外,我们也可以选择手动上传 Coredump 文件进行分析,点击 上传文件 按钮:

upload

然后在弹出框中按照提示从本地目录下选中对应的 Coredump 文件和 node 可执行文件,点击 提交 按钮即可传上云端:

modal

需要注意的是,请将 Coredump 文件以 .core 结尾重命名,Node 可执行文件以 .node 结尾重命名,推荐的命名方式为 <os info>-<alinode/node>-<version>.node,方便以后回顾,比如 centos7-alinode-v4.2.2.node 这种。最后 Coredump 文件和 node 可执行文件之间必须是 一一对应 的关系。这里一一对应指的是:这份 Coredump 文件必须是由这个 Node 可执行文件启动的进程生成的,如果这两者没有一一对应,分析结果往往是无效信息。