发送诊断中断(适用于高级用户)
警告
诊断中断供高级用户使用。使用不当会对您的实例产生负面影响。向实例发送诊断中断可能会触发实例崩溃和重新启动,从而导致数据丢失。
您可以将诊断中断发送到无法访问或无响应的 Linux 实例以手动触发内核错误。
在出现内核错误时,Linux 操作系统通常会发生崩溃并重启。操作系统的具体行为取决于其配置。内核错误也可用于使实例的操作系统内核执行任务,例如生成崩溃转储文件。然后,您可以使用崩溃转储文件中的信息进行根本原因分析并调试实例。
崩溃转储数据由操作系统在实例本身上本地生成。
在向您的实例发送诊断中断之前,我们建议您查阅适合您操作系统的文档,然后进行必要的配置更改。
支持的实例类型
除 Amazon Graviton 处理器支持的实例类型外的所有基于 Nitro 的实例类型均支持诊断中断。有关更多信息,请参阅 基于 Nitro 系统构建的实例 和 Amazon Graviton
先决条件
在使用诊断中断之前,必须配置实例的操作系统。这可确保它在发生内核错误时执行所需的操作。
将 Amazon Linux 2 配置为在发生内核错误时生成崩溃转储
-
连接到您的 实例。
-
安装 kexec 和 kdump。
[ec2-user ~]$
sudo yum install kexec-tools -y -
配置内核以便为辅助内核预留适当的内存量。要预留的内存量取决于实例的总可用内存。使用首选文本编辑器打开
/etc/default/grub
文件,找到以GRUB_CMDLINE_LINUX_DEFAULT
开始的行,然后按以下格式添加crashkernel
参数:crashkernel=
。例如,要预留memory_to_reserve
160MB
,请修改grub
文件,如下所示:GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=160M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0" GRUB_TIMEOUT=0 GRUB_DISABLE_RECOVERY="true"
-
保存更改并关闭
grub
文件。 -
重新构建 GRUB2 配置文件。
[ec2-user ~]$
sudo grub2-mkconfig -o /boot/grub2/grub.cfg -
在基于 Intel 和 AMD 处理器的实例上,
send-diagnostic-interrupt
命令将未知的非屏蔽中断 (NMI) 发送到实例。您必须将内核配置为在收到未知 NMI 时发生崩溃。使用首选文本编辑器打开/etc/sysctl.conf
文件,并添加以下内容。kernel.unknown_nmi_panic=1
-
重启实例并重新连接到它。
-
使用正确的
crashkernel
参数验证是否已启动内核。$
grep crashkernel /proc/cmdline以下示例输出指示成功的配置。
BOOT_IMAGE=/boot/vmlinuz-4.14.128-112.105.amzn2.x86_64 root=UUID=a1e1011e-e38f-408e-878b-fed395b47ad6 ro crashkernel=160M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
-
确认 kdump 服务正在运行。
[ec2-user ~]$
systemctl status kdump.service以下示例输出显示在 kdump 服务正在运行的情况下的结果。
kdump.service - Crash recovery kernel arming Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2019-05-24 23:29:13 UTC; 22s ago Process: 2503 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS) Main PID: 2503 (code=exited, status=0/SUCCESS)
注意
默认情况下,崩溃转储文件将保存到 /var/crash/
。要更改位置,请使用首选文本编辑器修改 /etc/kdump.conf
文件。
将 Amazon Linux 配置为在发生内核错误时生成崩溃转储
-
连接到您的 实例。
-
安装 kexec 和 kdump。
[ec2-user ~]$
sudo yum install kexec-tools -y -
配置内核以便为辅助内核预留适当的内存量。要预留的内存量取决于实例的总可用内存。
$
sudo grubby --args="crashkernel=memory_to_reserve
" --update-kernel=ALL例如,要为崩溃内核预留
160MB
,请使用以下命令。$
sudo grubby --args="crashkernel=160M" --update-kernel=ALL -
在基于 Intel 和 AMD 处理器的实例上,
send-diagnostic-interrupt
命令将未知的非屏蔽中断 (NMI) 发送到实例。您必须将内核配置为在收到未知 NMI 时发生崩溃。使用首选文本编辑器打开/etc/sysctl.conf
文件,并添加以下内容。kernel.unknown_nmi_panic=1
-
重启实例并重新连接到它。
-
使用正确的
crashkernel
参数验证是否已启动内核。$
grep crashkernel /proc/cmdline以下示例输出指示成功的配置。
root=LABEL=/ console=tty1 console=ttyS0 selinux=0 nvme_core.io_timeout=4294967295 LANG=en_US.UTF-8 KEYTABLE=us crashkernel=160M
-
确认 kdump 服务正在运行。
[ec2-user ~]$
sudo service kdump status如果该服务正在运行,则命令将返回
Kdump is operational
响应。
注意
默认情况下,崩溃转储文件将保存到 /var/crash/
。要更改位置,请使用首选文本编辑器修改 /etc/kdump.conf
文件。
配置 SUSE Linux Enterprise、Ubuntu 或 Red Hat Enterprise Linux
请参阅以下网站:
注意
在基于 Intel 和 AMD 处理器的实例上,send-diagnostic-interrupt
命令将未知的非屏蔽中断 (NMI) 发送到实例。您必须将内核配置为在收到未知 NMI 时发生崩溃。将以下内容添加到配置文件。
kernel.unknown_nmi_panic=1
发送诊断中断
在完成必要的配置更改后,您可以使用 Amazon CLI 或 Amazon EC2 API 将诊断中断发送到实例。
将诊断中断发送到实例 (Amazon CLI)
使用 send-diagnostic-interrupt 命令并指定实例 ID。
aws ec2 send-diagnostic-interrupt --instance-id
i-1234567890abcdef0