coredump是指在程序运行过程中发生异常终止或崩溃时,操作系统将程序的内存内容转储到一个特殊的文件中,以便于后续的调试和分析。本文介绍如何为ECI实例开启coredump,以便在容器异常终止时可以查看分析coredump生成的文件,从而定位问题原因,修复程序异常。
背景信息
在Linux中,如果程序突然异常终止或者崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做coredump。此时,您可以查看分析coredump生成的core文件,找出问题原因。
Linux中支持coredump(Action为Core)的Signal如下图所示。
更多信息,请参见coredump file。
功能概述
ECI默认关闭coredump,避免磁盘占用过多而导致业务不可用。您可以根据需要选择以下一种方式开启coredump:
方式一:开启coredump运维任务
手动开启coredump后,将生成一个运维任务。在容器运行异常终止或者退出时,触发coredump生成的core文件将自动保存到OSS中。
方式二:自定义设置core文件保存路径
支持自定义设置core文件保存到外挂存储中,设置保存路径后,将自动开启coredump。在容器运行异常终止或者退出时,触发coredump生成的core文件,将保存到指定的外挂存储的路径下。
方式一便于操作,但有时效和地域等限制,可用于临时调试和诊断程序。
生成的运维任务为一次性任务,执行成功获取到一次core文件后,将会关闭coredump,并且运维任务有一定的期限(12小时),超出时间后任务将会失效。
不支持以下地域:华北6(乌兰察布)、华南2(河源)、华南3(广州)、华东5(南京-本地地域)、菲律宾(马尼拉)、韩国(首尔)、泰国(曼谷)。
方式二需要额外配置外挂存储,在程序运行状态不稳定的情况下,可以采用该方式确保能够获取到core文件,但如果程序有问题,反复重启可能会产生大量core文件。
方式一:开启coredump运维任务
控制台
登录弹性容器实例控制台。
为ECI实例开启coredump。
单击目标实例ID,打开实例详情页面。
单击运维页签,然后选择Coredump页签,单击开启。
开启coredump后,系统将生成一个运维任务,未触发coredump时,任务状态为等待中。
触发coredump。
连接ECI实例,在容器内执行
sleep 100
命令后按Ctrl
+\
键,触发coredump,生成的core文件将自动保存到OSS中。下载core文件。
触发coredump生成core文件后,运维任务的状态将变为成功,此时单击对应结果列中的下载即可下载core文件到本地。
说明如果下载没有反应,请检查浏览器的网站权限设置。
OpenAPI
为ECI实例开启coredump。
调用CreateInstanceOpsTask接口创建运维任务,需指定目标ECI实例,然后将OpsType设为
coredump
,OpsValue设为enable
,即可开启coredump。更多信息,请参见CreateInstanceOpsTask。说明指定ECI实例时,需确保目标ECI实例在创建时没有设置CorePattern。
触发coredump。
连接ECI实例,在容器内执行
sleep 100
命令后按Ctrl
+\
键,触发coredump,生成的core文件将自动保存到OSS中。下载Core文件。
调用DescribeInstanceOpsRecords接口查看运维任务的结果,从返回信息的ResultContent中,可以获取core文件保存在OSS中的地址,访问该地址即可下载core文件。
方式二:自定义设置core文件保存路径
core文件一般用于离线分析问题,因此设置core文件的保存路径时,一般采用外挂存储,而不是保存在容器本地路径,避免容器退出而丢失core文件。ECI支持自定义设置core文件保存路径,设置后将自动开启coredump。
调用CreateContainerGroup接口创建ECI实例时,可传入CorePattern参数来设置core文件保存路径。相关参数说明如下,更多信息,请参见CreateContainerGroup。
示例以NFSVolume作为示例,Volume相关参数请根据实际Volume类型进行配置。
名称 | 类型 | 示例值 | 描述 |
CorePattern | String | /data/dump-a/core | 自定义设置Core dump文件的保存目录。 重要 配置的路径不能以 |
Volume.N.Name | String | volume1 | 数据卷名称。 |
Volume.N.Type | String | NFSVolume | 数据卷类型。本文以NFSVolume为例。 |
Volume.N.NFSVolume.Path | String | /dump | NFS数据卷的路径。 |
Volume.N.NFSVolume.Server | String | 143b24****-gfn3.cn-beijing.nas.aliyuncs.com | NFS服务器地址。 如果使用阿里云文件存储NAS,则此处为NAS文件系统的挂载点地址。 |
Container.N.VolumeMount.N.Name | String | volume1 | 要挂载到容器的数据卷的名称,对应Volume.N.Name的值。 |
Container.N.VolumeMount.N.MountPath | String | /data/dump-a/ | 挂载目录。 容器挂载目录下的内容会被数据卷的内容直接覆盖,请准确填写。 |
以使用NAS作为外挂存储为例,示例如下:
创建一台ECI实例A,挂载NAS并设置core文件保存路径。
调用CreateContainerGroup接口创建ECI实例A时传入以下参数,将NAS的
/dump/
目录挂载到容器的/data/dump-a/
目录,将core文件保存路径设置为/data/dump-a/core
。ContainerGroupName=test-a SecurityGroupId=sg-bp1daxpbz9lzpvvc**** VSwitchId=vsw-bp1gds63lmlm7ib05**** # 声明数据卷 Volume.1.Name=volume1 Volume.1.Type=NFSVolume Volume.1.NFSVolume.Path=/dump/ Volume.1.NFSVolume.Server=143b24****-gfn3.cn-beijing.nas.aliyuncs.com # 为容器挂载数据卷 Container.1.Name=nginx Container.1.Image=registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 Container.1.VolumeMount.1.Name=volume1 Container.1.VolumeMount.1.MountPath=/data/dump-a/ # 设置core文件保存路径 CorePattern=/data/dump-a/core
在实例A的容器任意目录下触发coredump。
如下示例,在容器内执行
sleep 100
命令后同时按Ctrl
键和\
键,触发coredump后,core文件已保存到容器的/data/dump-a/
路径下。释放ECI实例A。
将同一NAS挂载到另一台ECI实例B。
调用CreateContainerGroup接口创建ECI实例B时传入以下参数,将同一NAS的
/dump/
目录挂载到容器的/data/dump-b/
目录。ContainerGroupName=test-nas-b SecurityGroupId=sg-bp1daxpbz9lzpvvc**** VSwitchId=vsw-bp1gds63lmlm7ib05**** # 声明数据卷 Volume.1.Name=volume1 Volume.1.Type=NFSVolume Volume.1.NFSVolume.Path=/dump/ Volume.1.NFSVolume.Server=143b24****-gfn3.cn-beijing.nas.aliyuncs.com # 为容器挂载数据卷 Container.1.Name=nginx Container.1.Image=registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 Container.1.VolumeMount.1.Name=volume1 Container.1.VolumeMount.1.MountPath=/data/dump-b/
在实例B的容器中查看core文件。
如下示例,在容器的
/data/dump-b/
路径下可以看到core文件,core文件保存到外挂存储后,并没有随着实例A的释放而丢失,您仍可以查看分析core文件。
常见问题
触发coredump后,在控制台下载core文件没有反应,怎么办?
如果下载没有反应,请检查浏览器的网站权限设置。例如Chrome浏览器可以参考以下方式开启权限:
打开弹性容器实例控制台,单击浏览器地址栏前面的图标,选择网站设置。
将配置项不安全内容改为允许。