当前位置: 首页 > 科技观察

浅谈Linux内核中的Watchdog

时间:2023-03-20 11:07:20 科技观察

本文转载请联系邂逅Linux公众号。Linux内核中一共有三个看门狗(watchdogs),都需要细心的喂养和呵护。如何喂看门狗,linux内核中有示例代码:samples/watchdog/watchdog-simple.c//SPDX-License-Identifier:GPL-2.0#include#include#include#includeintmain(void){intfd=open("/dev/watchdog",O_WRONLY);intret=0;if(fd==-1){perror("看门狗");exit(EXIT_FAILURE);}while(1){ret=write(fd,"\0",1);if(ret!=1){ret=-1;break;}sleep(10);}close(fd);returnret;}在此示例中,每10秒将0写入“/dev/watchdog”文件。这个watchdog很好用,但是在实际项目中用处太大了。例如:某国央行在一台4T内存、320个CPU核的Linux服务器上运行一个数据库程序。有他所在国家所有人的银行账户信息。数据库程序运行时出现IO读写错误,或者程序有bug,一下子就卡住了。国民经济瞬间瘫痪。这个时候想一想,Linux系统中有没有什么机制可以解决这种问题呢?这时候,“/dev/watchdog”就在这里了。这时候你只需要在数据库程序中加入一个类似上面的示例程序,每隔10s就去喂狗一次,只要数据库程序卡住,拿到之后就不能喂狗了卡住,比如默认60s后,狗会罢工,默认触发服务器立即重启。重启服务器会重新加载数据库程序,或者在服务器重启过程中,由于服务器与所在服务器集群断开连接,会触发集群中的脑裂检测,数据库程序会被移至集群中的其他设备运行。减少了很多损失。所以这个狗/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/watchdog0watchdogd实时调度线程负责具体执行看门狗,/dev/watchdog是内核提供给用户层的通用操作接口文件,用于打开看门狗,喂看门狗,查询状态等。/dev/watchdog0是具体实现看门狗,可以基于具体的物理设备来实现,也可以通过在软件中模拟硬件来实现softdog内核模块(具体使用方法:modprobesoftdog)。来看下softdog内核模块怎样模拟硬件实现这个功能:staticint__initsoftdog_init(void)hrtimer_init(&softdog_ticktock,CLOCK_MONOTONIC,HRTIMER_MODE_REL);softdog_ticktock.function=softdog_fire;staticenumhrtimer_restartsoftdog_fire(structhrtimer*timer)emergency_restart();staticintsoftdog_ping(structwatchdog_device*w)hrtimer_start(&softdog_ticktock,ktime_set(w->timeout,0),(60s)HRTIMER_MODE_REL);从代码实现来看,很容易理解,打开看门狗后(打开“/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。