使用coredump分析实例程序异常

coredump是指在程序运行过程中发生异常终止或崩溃时,操作系统将程序的内存内容转储到一个特殊的文件中,以便于后续的调试和分析。本文介绍如何为ECI Pod(即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运维任务

通过弹性容器实例控制台,可以手动开启coredump运维任务。

  1. 登录弹性容器实例控制台

  2. 为ECI实例开启coredump。

    1. 单击目标实例ID,打开实例详情页面。

    2. 单击运维页签,然后选择Coredump页签,单击开启

      开启coredump后,系统将生成一个运维任务,未触发coredump时,任务状态为等待中

      coredump-1

  3. 触发coredump。

    连接ECI实例,在容器内执行sleep 100命令后按Ctrl+\键,触发coredump,生成的core文件将自动保存到OSS中。coredump2

  4. 下载core文件。

    触发coredump生成core文件后,运维任务的状态将变为成功,此时单击对应结果列中的下载即可下载core文件到本地。

    coredump-2

    说明

    如果下载没有反应,请检查浏览器的网站权限设置。

方式二:自定义设置core文件保存路径

core文件一般用于离线分析问题,因此设置core文件的保存路径时,一般采用外挂存储,而不是保存在容器本地路径,避免容器退出而丢失core文件。ECI支持自定义设置core文件保存路径,设置后将自动开启coredump。

重要

配置的路径不能以|开头,即不能通过coredump来配置可执行程序。

以使用NAS作为外挂存储为例,配置示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: coredump-test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      name: nginx-test
      labels:
        app: nginx
        alibabacloud.com/eci: "true" 
      annotations:
        k8s.aliyun.com/eci-core-pattern: "/data/dump-a/core"    # 设置core文件保存路径
    spec:
      containers:
      - name: nginx
        image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nas-volume
            mountPath: /data/dump-a/
      volumes:     # 挂载NAS
        - name: nas-volume
          csi:
            driver: nasplugin.csi.alibabacloud.com
            fsType: nas
            volumeAttributes:
              server: "0389a***-nh7m.cn-shanghai.extreme.nas.aliyuncs.com"
              path: "/"
              vers: "3"
              options: "nolock,tcp,noresvport"

常见问题

触发coredump后,在控制台下载core文件没有反应,怎么办?

如果下载没有反应,请检查浏览器的网站权限设置。例如Chrome浏览器可以参考以下方式开启权限:

  1. 打开弹性容器实例控制台,单击浏览器地址栏前面的浏览器图标图标,选择网站设置浏览器设置1

  2. 将配置项不安全内容改为允许浏览器设置2