内核已编译启用nmi watchdog需确认config_hardlockup_detector_perf或config_hardlockup_detector为y;x86_64依赖perf,arm需arm_pmu;运行时须echo 1 > /proc/sys/kernel/nmi_watchdog并验证watchdog/x线程存在,且bios中local apic开启、c-states未禁用nmi。

确认内核已编译启用 NMI watchdog 支持
没编译进内核的选项,后续所有操作都无效。先检查 CONFIG_HARDLOCKUP_DETECTOR_PERF 或 CONFIG_HARDLOCKUP_DETECTOR 是否为 y:
cat /boot/config-$(uname -r) | grep HARDLOCKUP
常见错误是只启用了 CONFIG_SOFTLOCKUP_DETECTOR(软死锁),但漏掉硬死锁所需的 perf 或 x86-specific 硬件检测器。ARM 平台需确认是否启用 CONFIG_HARDLOCKUP_DETECTOR_ARM_PMU;x86_64 一般依赖 CONFIG_HARDLOCKUP_DETECTOR_PERF。
运行时开启 nmi_watchdog 并验证状态
内核参数 nmi_watchdog 和 sysctl 接口 /proc/sys/kernel/nmi_watchdog 是同一开关的两种控制方式,优先用后者:
- 临时启用:
echo 1 > /proc/sys/kernel/nmi_watchdog - 验证是否生效:
cat /proc/sys/kernel/nmi_watchdog应输出1 - 检查对应 CPU 的 watchdog 线程是否启动:
ps aux | grep "watchdog/[0-9]"—— 每个 CPU 核心应有独立线程,如watchdog/0、watchdog/1
注意:/proc/sys/kernel/watchdog 控制的是软死锁检测(softlockup),和硬死锁无关;误改它不会影响 nmi_watchdog。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
硬死锁触发阈值由 watchdog_thresh 决定
硬死锁检测超时 = watchdog_thresh 秒(默认 10 秒),不是可单独配置的独立参数:
- 查看当前值:
cat /proc/sys/kernel/watchdog_thresh - 修改它会同时影响 softlockup(2×)和 hardlockup(1×):
echo 15 > /proc/sys/kernel/watchdog_thresh - 硬死锁实际检测机制依赖 perf event 或本地 APIC 定时器,必须确保
/proc/sys/kernel/nmi_watchdog为 1,否则 perf event 不注册,NMI 中断永不触发
典型错误:调高 watchdog_thresh 却忘记开 nmi_watchdog,结果日志里既无 hardlockup 也无 softlockup 提示——系统其实根本没启动任何 watchdog 检测线程。
如何确认硬死锁真被检测到了
单纯看 dmesg 不够,hardlockup 日志比 softlockup 更“安静”,且默认不 panic:
- 触发后典型日志关键词是:
Hard LOCKUP或NMI watchdog: BUG: hard lockup,不是soft lockup - 若只看到 softlockup 日志,说明
nmi_watchdog仍为 0,或 perf 子系统初始化失败(dmesg 里搜perf和watchdog) - 想让 hardlockup 主动 panic,需设
kernel.nmi_watchdog=panic启动参数,或运行时写echo panic > /proc/sys/kernel/nmi_watchdog(注意:该写法仅在部分内核版本支持,推荐用启动参数)
最易忽略的一点:x86 系统上,如果 BIOS 关闭了 Local APIC 或启用了 C-states 深度节能,NMI 可能无法送达 CPU,导致 watchdog 彻底失效——这时即使 nmi_watchdog=1,也永远不报 hardlockup。










