我一直在尝试调试运行 4.14.93-rt 内核时的随机系统冻结。为此,我使用以下配置在内核中启用了锁定检测器:
CONFIG_HAVE_HARDLOCKUP_DETECTOR_PERF=y
CONFIG_LOCKUP_DETECTOR=y
CONFIG_SOFTLOCKUP_DETECTOR=y
CONFIG_HARDLOCKUP_DETECTOR_PERF=y
CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y
CONFIG_HARDLOCKUP_DETECTOR=y
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1
目标是在发生锁定时触发内核恐慌。我还在内核命令行上启用了 NMI 看门狗:
nmi_watchdog=1
利用 kdump/kexec 工具,我已将系统配置为在内核崩溃时生成内核崩溃转储。该机制在手动触发恐慌时起作用:
echo c > /proc/sysrq-trigger
我可以确认在这种情况下系统加载了转储捕获内核。然而,当遇到实际的锁定时,系统只会在看门狗启动时重新启动。据我所知,不会发生内核恐慌。没有切换到转储捕获内核。没有核心转储,日志中没有存储任何内容。
请注意,我启用了所有相关的 sysctl 选项:
kernel.panic = 1
kernel.panic_on_oops = 1
kernel.unknown_nmi_panic = 1
kernel.panic_on_unrecovered_nmi = 1
kernel.panic_on_io_nmi = 1
kernel.softlockup_panic = 1
kernel.hung_task_panic = 1
当我遇到现实生活中的系统冻结时,我会看到这种行为。当在具有高 RT 优先级的所有内核上运行 CPU 占用 while 循环时,也会发生这种情况。我希望这会被检测为挂起任务并导致恐慌。
在这种情况下,什么会导致重新启动而不触发恐慌/kdump 机制?