配置操作系统dump
操作场景
云服务器的操作系统在运行过程中如果出现故障,可能导致系统崩溃,例如操作系统蓝屏或死机。在这种情况下,如果使用操作系统dump,系统会将内存中的数据以存储文件的形式进行保存,以便于进行云服务器的故障定位和问题分析。
本文介绍如何配置操作系统dump的方法。
背景知识
操作系统dump,即内核转储或崩溃转储,是当云服务器系统运行出现异常时,对操作系统内存数据的实时完整备份。
操作系统dump功能主要利用操作系统内核对硬件异常的处理能力。操作系统内核可以监测到硬件异常,并根据异常的类型来决定处理方式。当系统遇到无法处理的异常或错误时,系统的部分或全部运行状态信息将会转储到磁盘上,这些状态信息包括:CPU的寄存器、物理内存、进程状态、文件系统状态、硬件设备状态等。
操作系统dump可以由以下几种方式触发:
- 系统崩溃:当操作系统遇到无法处理的异常或错误时,例如非法的内存访问、内核panic等,系统会自动触发dump。
- 手动触发:系统管理员也可以通过一些命令或者操作手动触发系统dump,例如在Linux系统中可以通过向/proc/sysrq-trigger写入c字符来触发系统dump。
- 计划触发:某些情况下,系统管理员为了获取系统的某一时刻的运行状态信息,或者模拟系统崩溃的情况,也可以设置在某一特定的时间触发系统dump。
在多数情况下,为了准确获得系统dump,需要对系统进行相关的配置,例如在Linux系统中,需要配置kdump服务等。本文主要介绍手动触发dump的操作指导。
约束与限制
- 执行操作系统dump会重启云服务器,请提前做好业务备份,避免数据丢失。
- 鲲鹏架构的云服务器不支持操作系统dump。
- 支持运行中、关机和故障状态的云服务器进行操作系统dump。
- 仅支持对4vCPUs,8GiB内存以上规格的ECS使用操作系统dump功能。
- 预留内存需大于ECS规格的内存。
配置操作系统dump(Windows)
本文以Windows Server 2016版本操作系统为例进行介绍,更多版本的操作,请参考对应操作系统官网帮助文档。
- 远程登录云服务器。
- 在“控制面板中,打开“系统 > 高级系统配置”。
图1 高级系统配置
- 在“系统属性”的“性能”区域,单击“设置”。
- 在“高级”页签的“虚拟内存”区域,单击“更改”。
图2 性能选项设置
- 在“虚拟内存”页面,勾选“自动管理所有驱动器的分页文件大小”。
图3 虚拟内存设置
- 单击“确定”,完成虚拟内存设置。
- 在“系统属性”的“启动和故障恢复”区域,单击“设置”。
- 设置参数。
- 写入调试信息:设置为“完全内存转储”。
- 转储文件:可以将路径从“%SystemRoot%\Memory.dmp”更改为指向具有足够磁盘空间的本地驱动器,例如“E:\Memory.dmp”。
图4 启动和故障恢复设置
- 单击“确定”。
- 重启云服务器,完成配置。
配置操作系统dump(Linux)
本文以CentOS 7.5版本操作系统为例进行介绍,更多版本的操作,请参考对应操作系统官网帮助文档。
- 远程登录云服务器。
- 执行以下命令,安装kexec-tools。
- 执行以下命令,查看crashkernel预留内存大小。
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="net.ifnames=0 consoleblank=600 console=tty0 console=ttyS0,115200n8 spectre_v2=off nopti crashkernel=auto " GRUB_DISABLE_RECOVERY="true"
- 执行以下命令,设置crashkernel的大小。
当前crashkernel预留内存大小为“auto”,您可以在“GRUB_CMDLINE_LINUX”字段,修改“crashkernel”的值,设置crashkernel的大小。
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="net.ifnames=0 consoleblank=600 console=tty0 console=ttyS0,115200n8 spectre_v2=off nopti crashkernel=256M" GRUB_DISABLE_RECOVERY="true"
您可以根据系统架构决定crashkernel预留内存大小,过小会导致生成coredump文件失败。
当前示例的系统内存是1GiB,预留内存设置为256M。
- 执行以下命令,重新生成grub配置文件。
- 执行以下命令,编辑内核参数文件/etc/sysctl.conf。
在/etc/sysctl.conf配置文件中增加以下参数,以便于在收到NMI时将操作系统切换到应急模式,并生成内存转储。
kernel.panic_on_unrecovered_nmi=1 kernel.unknown_nmi_panic=1
- 重启系统。
- 执行以下命令,修改kdump默认配置/etc/kdump.conf。
#指定coredump文件存储位置 path /var/crash #增加-c参数,代表压缩coredump文件 core_collector makedumpfile -c -l --message-level 1 -d 31 #生成coredump后,重启系统 default reboot
- 执行以下命令,开启kdump服务并设置开机自启动。
systemctl enable kdump.service
- 执行以下命令,检查kdump是否开启成功。
Redirecting to /bin/systemctl status kdump.service ● kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled) Active: active (exited) since Wed 2024-05-22 21:19:47 CST; 11min ago Main PID: 591 (code=exited, status=0/SUCCESS) CGroup: /system.slice/kdump.service
systemctl is-active kdump.service
active
触发操作系统dump
- 登录管理控制台。
- 单击管理控制台左上角的,选择区域和项目。
- 单击“”,选择“计算 > 弹性云服务器”。
- 在弹性云服务器列表的“操作”列,单击“更多 > 故障排查 > 触发操作系统dump”。
- 了解风险须知后,勾选已知晓风险的提示。
- 单击“确定”,完成触发操作系统dump。