SpringBoot集成Watchdog的完整步骤教学
作者:风象南
1. 为什么需要 Watchdog
很多 Spring Boot 应用在生产环境里遇到过类似问题
看似存活,实则不可用:/actuator/health
依然返回 200,但线程池/GC 已经彻底卡死
监控延迟发现:Prometheus 抓到的是几分钟后的异常
人工干预成本高:只能 SSH 上去 kill -9
或重启服务
解决思路
应用层自检:Actuator、线程池监控、自愈脚本
系统级兜底:Linux Watchdog
本文重点介绍 如何在 Linux 上安装配置 watchdog 并与 SpringBoot 集成
2. Linux Watchdog 简介
Linux Watchdog 本质是一个内核驱动,通常通过 /dev/watchdog 设备暴露给用户空间。
它的特点:
- 需要用户进程定时“喂狗”(写入数据);
- 一旦超过设定时间没被喂 → Watchdog 触发动作(重启系统/关闭电源/触发 NMI 等);
- 属于 最后兜底机制,防止应用假死。
3. 安装与配置 Watchdog
3.1 安装 watchdog 服务
在常见的 Linux 发行版中,watchdog 通常不是默认安装的,需要手动安装:
Debian/Ubuntu:
sudo apt-get update sudo apt-get install watchdog
CentOS/RHEL/UOS:
sudo yum install watchdog
安装完成后,会得到:
- 配置文件:
/etc/watchdog.conf
- systemd 服务:
watchdog.service
3.2 加载内核驱动
常见的 Watchdog 驱动有:
- Intel 平台:
iTCO_wdt
- AMD 平台:
sp5100_tco
- 虚拟化环境(QEMU/KVM):
softdog
检查是否支持:
ls /lib/modules/$(uname -r)/kernel/drivers/watchdog/
加载驱动,例如:
sudo modprobe iTCO_wdt # Intel 芯片 sudo modprobe softdog soft_panic=1 # 如果没有硬件 watchdog,可用软件模拟
加载后应该能看到设备文件:
ls /dev/watchdog* # 输出类似: # /dev/watchdog /dev/watchdog0
3.3 配置 watchdog 服务
编辑 /etc/watchdog.conf
:
以下为几项核心配置
watchdog-device = /dev/watchdog interval = 5 max-load-1 = 24 min-memory = 1 realtime = yes priority = 1
解释:
watchdog-device
→ 使用哪个 watchdog 设备;interval
→ 心跳间隔(秒);max-load-1
→ 负载过高时触发重启;min-memory
→ 可用内存低于阈值时触发重启。
3.4 启动并验证服务
sudo systemctl enable watchdog sudo systemctl start watchdog sudo systemctl status watchdog
验证 watchdog 是否正在运行:
dmesg | grep watchdog # 或者: journalctl -u watchdog
4. SpringBoot 集成 Watchdog
在系统 watchdog 运行的基础上,我们让 SpringBoot 主动与它交互,实现应用层喂狗逻辑。
Watchdog 喂狗任务
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @Component public class WatchdogService implements CommandLineRunner { private FileOutputStream watchdog; @Override public void run(String... args) { // 先执行 shell 命令安装 softdog 并启动 watchdog 服务 String[] commands = { "modprobe -r softdog", "modprobe softdog soft_panic=1", "systemctl stop watchdog", "systemctl start watchdog" }; for (String cmd : commands) { try { Process process = new ProcessBuilder("/bin/sh", "-c", cmd) .inheritIO() // 输出到控制台 .start(); int exitCode = process.waitFor(); if (exitCode != 0) { System.err.println("命令失败: " + cmd); } } catch (IOException | InterruptedException e) { System.err.println("执行命令出错: " + cmd + ",原因:" + e.getMessage()); } } // 打开 /dev/watchdog 喂狗 try { watchdog = new FileOutputStream("/dev/watchdog"); } catch (IOException e) { System.err.println("无法打开 /dev/watchdog,请检查驱动和权限"); return; } Executors.newSingleThreadScheduledExecutor() .scheduleAtFixedRate(this::feedDog, 0, 5, TimeUnit.SECONDS); Runtime.getRuntime().addShutdownHook(new Thread(() -> { try { if (watchdog != null) { watchdog.close(); // 防止误触发 } } catch (IOException ignored) {} })); } private void feedDog() { try { watchdog.write("1".getBytes()); watchdog.flush(); } catch (IOException e) { System.err.println("喂狗失败:" + e.getMessage()); } } }
工作机制:
- 每 5 秒喂狗一次;
- 如果 JVM 卡死(GC、死锁、线程阻塞),喂狗失败,系统触发 watchdog → 强制重启;
- 在优雅停机时关闭 watchdog,避免误报。
5. 实战场景
线程池卡死:定时任务无法运行 → watchdog 超时 → 系统重启。
Full GC 停顿:JVM 挂起 → watchdog 未被喂 → 自动恢复。
进程死锁:所有线程卡死 → watchdog 兜底保护。
6. 最佳实践:应用层 + 系统层双保险
应用层自检
1、使用 Spring Boot Actuator 监控线程池、GC、响应时间
2、发现异常时尝试自愈(释放锁、降级、重启线程池)
系统层 watchdog
兜底方案,确保“再怎么挂死,系统都会拉起”。
这种 双保险模式 特别适合无人值守、远程运维的场景(如边缘计算设备、IoT 网关、金融终端)。
7. 总结
1、Linux Watchdog 不是默认可用,需要 安装软件包、加载驱动、配置 systemd 服务;
2、Spring Boot 可以轻松集成 watchdog 喂狗机制;
3、Watchdog 结合应用层监控,可以构建 自愈能力极强的高可用系统;
到此这篇关于SpringBoot集成Watchdog的完整步骤教学的文章就介绍到这了,更多相关SpringBoot集成Watchdog内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!