当前位置: 首页 > Linux

Linux内核中的watchdog

时间:2023-04-06 04:06:56 Linux

Linux内核中共有三种看门狗(watchdogs),它们都需要细心的喂养和呵护。./dev/watchdog,如何喂这个看门狗,linux内核中有示例代码:samples/watchdog/watchdog-simple.c1//SPDX-License-Identifier:GPL-2.02#include3#include4#include5#include67intmain(void)8{9intfd=open("/dev/watchdog",O_WRONLY);10intret=0;11if(fd==-1){12perror("watchdog");13exit(EXIT_FAILURE);14}15while(1){16ret=write(fd,"\0",1);17if(ret!=1){18ret=-1;19break;20}21sleep(10);22}23close(fd);24returnret;25}在这个例子中,每过10秒就会向“/dev/watchdog”文件写入0,也就是喂狗的过程。看到这个例子,似乎感觉不到这个watchdog有什么大用,但是在实际项目中,是非常有用的,例如:某国央行在一台4T内存的Linux服务器上运行一个数据库程序和320个CPU内核。全国所有人的银行账户信息。数据库程序在运行时出现IO读写错误,或者程序bug一下子卡住,那么他国人民就不能存钱,不能取钱,不能转钱。整个国民经济瞬间瘫痪这时候想想,linux系统中有没有什么机制可以解决这个问题,这时候“/dev/watchdog”来了,这时候你只需要添加一个类似于上面的数据库程序,每Feedthedog每10秒一次。只要数据库程序卡住,卡住后就不能喂狗了。比如默认60秒后,狗会罢工,默认立即重启服务器。重启服务器会重新加载数据库程序,或者在服务器重启过程中,由于服务器与所在服务器集群断开连接,会触发集群中的脑裂检测,数据库程序会被移至集群中的其他设备运行。减少了很多损失。所以这个狗/dev/watchdog太有用了。我们来看看它的实现原理:#ps-ef|grepwatchdogroot104202020?00:00:00[watchdogd]#ls-l/dev/watchdog*crw-------1rootroot10,130Dec3020:04/dev/watchdogcrw-------1rootroot247,0Dec3020:04/dev/watchdog0在系统中看到了一个内核线程watchdogd,还有两个字符文件:/dev/watchdog和/dev/watchdog0其中watchdogd实时调度线程负责具体执行喂狗,/dev/watchdog是内核提供给用户层的通用操作接口文件,用于启动狗,喂狗,查询状态等。/dev/watchdog0是一个看门狗的具体实现,可以基于具体的物理设备来实现,也可以通过在软件中模拟硬件来实现softdog内核模块(具体使用方法:modprobesoftdog)。下面看看softdog内核模块是如何模拟硬件实现这个功能的:1staticint__initsoftdog_init(void)2hrtimer_init(&softdog_ticktock,CLOCK_MONOTONIC,HRTIMER_MODE_REL);3softdog_ticktock.function=softdog_fire;45static枚举hrtimer_restartsoftdog_fire(启动hrtimer_restartsoftdog_fire)();78staticintsoftdog_ping(structwatchdog_device*w)9hrtimer_start(&softdog_ticktock,ktime_set(w->timeout,0),(60s)10HRTIMER_MODE_REL);从代码实现来看,很容易理解,当watchdog开启时(打开“/dev/watchdog”),默认60s后会触发系统重启。60s倒计时过程中,只喂一次狗(softdog_ping),会回到60s后触发系统重启,所以只要一直喂狗,emergency_restart()就不会执行,系统不会重启.再来看2.softlockup检测机制和3.hardlockup检测机制。softlockup检测机制的喂食方式是每个CPU上的hrtimer会唤醒一个migration/N内核线程,migration/N每次被唤醒都会重置某个时间戳。hardlockup检测机制的喂食方式是hrtimer每执行一次就会给一个变量加一。关于so??ftlockup和hardlockup检测机制的具体原理实现和应用场景,我最近发布了一个视频《Linux常见的锁和锁检测机制》,包括实现原理(linux内核代码层)和原理验证(使用ftrace调试方式),示例代码和动手模拟实验,可以充分理解softlockup/hardlockup。以上就是良序教程网为各位小伙伴们分享的Linux相关知识。