1.看门狗定义

Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。
内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需要保证在1分钟之内向这个设备写入数据(俗称“定期喂狗”),每次写操作会导致重新设定定时器。如果用户空间程序在1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作(“狗咬人了”呵呵)。通过这种机制,我们可以保证系统核心进程大部分时间都处于运行状态,即使特定情形下进程崩溃,因无法正常定时“喂狗”,Linux系统在看门狗作用下重新启动(reboot),核心进程又运行起来了。多用于嵌入式系统。

在这里插入图片描述
打开 /dev/watchdog 设备(“开门放狗”):

int fd_watchdog = open("/dev/watchdog", O_WRONLY);
if(fd_watchdog == -1) {
	int err = errno;
	printf("\n!!! FAILED to open /dev/watchdog, errno: %d, %s\n", err, strerror(err));
	syslog(LOG_WARNING, "FAILED to open /dev/watchdog, errno: %d, %s", err, strerror(err));
}

每隔一段时间向 /dev/watchdog 设备写入数据(“定期喂狗”):

//feed the watchdog
if(fd_watchdog >= 0) {
	static unsigned char food = 0;
	ssize_t eaten = write(fd_watchdog, &food, 1);
	if(eaten != 1) {
		puts("\n!!! FAILED feeding watchdog");
		syslog(LOG_WARNING, "FAILED feeding watchdog");
	}
}

关闭 /dev/watchdog 设备,通常不需要这个步骤:

close(fd_watchdog);
2. 定义详解

watchdog
简而言之,watchdog是为了保证系统正常运行,或者从死循环,死锁等异常状态退出的一种机制。

原理:

看门狗分硬件看门狗和软件看门狗。硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称“喂狗”),因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性方面不如硬件定时器,比如系统内部定时器自身发生故障就无法检测到。

软件看门狗分为两种,用于检测soft lockup的普通软狗(基于时钟中断),以及检测hard lockup的NMI狗(基于NMI中断)。

注1:时钟中断优先级小于NMI中断
注2:lockup,是指某段内核代码占着CPU不放。Lockup严重的情况下会导致整个系统失去响应。

soft lockup 和 hard lockup,它们的唯一区别是 hard lockup 发生在CPU屏蔽中断的情况下。

3. 软狗

单个cpu检测线程是否正常调度。

一般软狗的正常流程如下(假设软狗触发的时间为20s)
在这里插入图片描述
可能产生软狗的原因:
1.频繁处理硬中断以至于没有时间正常调度
2.长期处理软中断
3.对于非抢占式内核,某个线程长时间执行而不触发调度
4.以上all

4.NMI watchdog

单个CPU检测中断是否能够正常上报
当CPU处于关中断状态达到一定时间会被判定进入hard lockup

NMI检测流程:
在这里插入图片描述
可能产生NMI狗的原因:
1.长期处理某个硬中断
2.长时间在禁用本地中断下处理

NMI狗机制也是用一个percpu的hrtimer来喂狗,为了能够及时检测到hard lockup状态,在比中断优先级更高的NMI上下文进行检测。

5.硬狗

用于检测所有CPU是否正常运行
任何一个CPU都可以喂硬狗,当在一定时间内没有核喂狗,触发硬狗复位

硬狗检测流程:
在这里插入图片描述
可能产生硬狗的原因:
1.CPU(没有软狗,NMI狗触发条件)全部挂死
2.CPU之间存在硬件依赖关系,某一个CPU挂死,有软件层面的共享资源

每一个CPU上都有一个watchdog线程(线程名为watchdog/0,watchdog/1 …)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐