本文介绍如何开启Core dump,以便在容器异常终止时查看分析Core dump文件,找出问题原因。
背景信息
在Linux中,如果程序突然异常终止或者崩溃时,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core dump。此时,您可以查看分析Core dump文件,找出问题原因。
Linux中支持Core dump(Action为Core)的Signal如下图所示。
更多信息,请参见Core dump file。
功能概述
ECI默认关闭Core dump,避免磁盘占用过多而导致业务不可用。您可以根据需要选择以下一种方式了开启Core dump:
方式一:自定义设置Core文件保存路径
支持自定义设置Core文件保存到外挂存储中,设置保存路径后,将自动开启Core dump。在容器运行异常终止或者退出时,触发Core dump生成的Core文件,将保存到指定的外挂存储的路径下。
方式二:开启Core dump运维任务
手动开启Core dump后,将生成一个运维任务。在容器运行异常终止或者退出时,触发Core dump生成的Core文件将自动保存到OSS中。
方式一需要额外配置外挂存储,在程序运行状态不稳定的情况下,可以采用该方式确保能够获取到Core文件,但如果程序有问题,反复重启可能会产生大量Core文件。
方式二便于操作,但有时效和地域限制,可用于临时调试和诊断程序。
方式二生成的运维任务为一次性任务,执行成功获取到一次Core文件后,将会关闭Core dump,并且运维任务有一定的期限(12小时),超出时间后任务将会失效。
方式二基于阿里云对象存储OSS和消息服务MNS,因此ECI支持的地域中,以下不支持OOS和MMS的地域暂不支持使用该方式:华北2(北京)、华北6(乌兰察布)、华南2(河源)、华南3(广州)、华东5(南京)。
方式一:自定义设置Core文件保存路径
配置说明
ECI支持自定义设置Core文件保存路径,设置后将自动开启Core dump。Core文件一般用于离线分析问题,因此设置Core文件的保存路径时,一般采用外挂存储,而不是保存在容器本地路径,避免容器退出而丢失Core文件。配置方式如下:
配置的路径不能以|
开头,即不能通过Core dump来配置可执行程序。
Kubernetes
创建Pod时,可添加如下Annotation来设置Core文件保存路径:
annotations: k8s.aliyun.com/eci-core-pattern: "/xx/xx/core"
OpenAPI
调用CreateContainerGroup接口创建ECI实例时,可传入CorePattern参数来设置Core文件保存路径:
CorePattern = "/xx/xx/core"
配置示例
以OpenAPI场景,挂载NAS作为外挂存储为例:
创建一台ECI实例A,挂载NAS并设置Core文件保存路径。
调用CreateContainerGroup接口创建ECI实例A时传入以下参数,将NAS的
/dump/
目录挂载到容器的/data/dump-a/
目录,将Core文件保存路径设置为/data/dump/core
。'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.VolumeMount.1.Name': 'volume1', 'Container.1.VolumeMount.1.MountPath': '/data/dump-a/', 'CorePattern':'/data/dump-a/core',
在实例A的容器任意目录下触发Core dump。
如下示例,在容器内执行
sleep 100
命令后同时按Ctrl
键和\
键,触发Core dump后,Core文件已保存到容器的/data/dump-a/
路径下。释放ECI实例A。
将同一NAS挂载到另一台ECI实例B。
调用CreateContainerGroup接口创建ECI实例B时传入以下参数,将同一NAS的
/dump/
目录挂载到容器的/data/dump-b/
目录。'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.VolumeMount.1.Name': 'dvolume1', 'Container.1.VolumeMount.1.MountPath': '/data/dump-b/',
在实例B的容器中查看Core文件。
如下示例,在容器的
/data/dump-b/
路径下可以看到Core文件,Core文件保存到外挂存储后,并没有随着实例A的释放而丢失,您仍可以查看分析Core文件。
方式二:开启Core dump运维任务
控制台
登录弹性容器实例控制台,创建一个ECI实例。
开启Core dump。
单击实例ID打开实例详情页面。
单击运维页签,然后单击开启。
单击开启后,将生成一个运维任务,未触发Core dump时,任务状态为等待中。
触发Core dump。
在容器内执行
sleep 100
命令后同时按Ctrl
键和\
键,触发Core dump,生成的Core文件将自动保存到OSS中。下载Core文件。
在实例详情页的运维页签下,可以查看Core dump对应的运维任务。触发Core dump生成Core文件后,运维任务的状态将变为成功,此时单击对应结果列中的下载即可下载Core文件到本地。
如果下载没有反应,请检查浏览器的网站权限设置。例如Chrome浏览器可以参考以下方式开启权限:
打开弹性容器实例控制台,单击浏览器地址栏前面的
图标,选择网站设置。
将配置项不安全内容改为允许。
OpenAPI
创建一个ECI实例。
调用CreateContainerGroup接口创建ECI实例时,请勿设置CorePattern。
开启Core dump。
调用CreateInstanceOpsTask接口创建运维任务,将OpsType设为
coredump
,OpsValue设为enable
,即可开启Core dump。更多信息,请参见CreateInstanceOpsTask。触发Core dump。
连接ECI实例,在容器内执行
sleep 100
命令后按Ctrl
+\
键,触发coredump,生成的core文件将自动保存到OSS中。下载Core文件。
调用DescribeInstanceOpsRecords接口查看运维任务的结果,从返回信息的ResultContent中,可以获取Core文件保存在OSS中的地址,访问该地址即可下载Core文件。