linux内核中有多个watchdog,他们属于不同模块,可同时存在。

用户态watchdog

可以在用户态程序操作,设置超时时间喂狗时间 。(只是通过内核提供的接口操作)

1、/dev/watchdog

此watchdog的基本工作原理是:当watchdog启动后(即/dev/watchdog 设备被打开后),如果在某一设定的时间间隔内/dev/watchdog没有被执行写操作(喂狗操作), 硬件watchdog电路或软件定时器就会重新启动系统。
/dev/watchdog 是一个主设备号为10, 从设备号130的字符设备。 Linux内核不仅为各种不同类型的watchdog硬件电路提供了驱动,还提供了一个基于定时器的纯软件watchdog驱动。 驱动源码位于内核源码树drivers/watchdog/目录下,软件watchdog对应与softdog.c。

硬件watchdog必须有硬件电路支持, 设备节点/dev/watchdog对应着真实的物理设备, 不同类型的硬件watchdog设备由相应的硬件驱动管理。软件watchdog由一内核模块softdog.o 通过定时器机制实现,/dev/watchdog并不对应着真实的物理设备,只是为应用提供了一个与操作硬件watchdog相同的接口。

1、对用户态喂狗程序而言,硬件/软件watchdog是透明的;
2、cat /dev/watchdog可以打开dog进行测试,不喂狗的情况下,timeout后系统会自动重启
3、对于/dev/watchdog 来说有一个内核线程与之对应。[watchdogd]; 满足一定条件时此线程会进行喂狗操作。(条件参考内核代码:watchdog_need_worker函数)

2、虚拟化场景下的/dev/watchdog

libvirt支持为kvm/qemu客户机创建watchdog,用于当客户机内部crash时,自动会触发相应的action。

libvirt支持模拟以下几种watchdog:

i6300esb - 推荐的watchdog,模拟为一种pci设备,openstack层面只支持这一种(nova拼写xml中写死)。
ib700 - 模拟为platform设备,xml中请勿分配pci设备号(不需要拼写

)。
diag288 - 模拟S390中的diag288设备,需要S390硬件支持。

action支持以下几种方式:

disabled:不使用watchdog设备
reset:强行重置虚拟机
poweroff:强行关闭虚拟机
pause:暂停虚拟机
none:只是启用watchdog,在虚拟机hang住时不执行任何操作

创建相应的虚拟机,qemu会为虚拟机虚拟出i6300esb硬件狗设备,虚拟机内部可以看到相应的设备。

在guest内操作/dev/watchdog和非虚拟化环境没有区别。
当watchdog动作触发后,libvirt还会触发event事件来告知上层应用(例如nova),进而可以将此事件反馈给用户。

Kernel watchdog

kernel watchdog是用来检测Lockup 的。所谓lockup,是指某段内核代码占着CPU不放。Lockup严重的情况下会导致整个系统失去响应。Lockup有几个特点:

首先只有内核代码才能引起lockup,因为用户代码是可以被抢占的,不可能形成lockup;
其次内核代码必须处于禁止内核抢占的状态(preemption disabled),因为Linux是可抢占式的内核,只在某些特定的代码区才禁止抢占(例如spinlock),在这些代码区才有可能形成lockup。

Lockup分为两种:soft lockup 和 hard lockup,它们的区别是 hard lockup 发生在CPU屏蔽中断的情况下。而soft lockup则是单个CPU被一直占用的情况(中断仍然可以响应)

NMI知识:
NMI即非可屏蔽中断。即使设置了屏蔽所有中断的时候,NMI也是不可以被屏蔽的;
中断分为可屏蔽中断和非可屏蔽中断:
可屏蔽中断:包含时钟中断,外设中断(比如键盘中断,I/O设备中断,等等),关闭中断时此类中断会被屏蔽。
NMI:即便在关闭中断的情况下,也能被响应的中断。触发NMI的条件一般都是ECC error之类的硬件Error。但NMI也给我们提供了一种机制,在系统中断被误关闭的情况下,依然能通过中断处理程序来执行一些紧急操作,比如kernel panic。
具有不一样的优先级,依次是kernel线程 < 时钟中断 < NMI中断。其中,kernel 线程是可以被调度的,同时也是可以被中断随时打断的。

SoftLockup

//对应代码位置kernel/watchdog.c
检测机制:
SoftLockup 检测首先需要对每一个CPU core注册叫做watchdog的kernel线程。即[watchdog/0],[watchdog/1]…。如果该线程在设定的期限内没有得到执行的话就意味着发生了soft lockup。

同时,系统会有一个高精度的计时器hrtimer(一般来源于APIC),该计时器能定期产生时钟中断,该中断对应的中断处理例程是kernel/watchdog.c: watchdog_timer_fn(),
此函数完成以下工作:

  • 要递增计数器hrtimer_interrupts(一个内核per cpu变量),这个计数器同时为hard lockup detector用于判断CPU是否响应中断;(给hardlockup使用,暂时不涉及)
  • 还要唤醒[watchdog/x]内核线程,该线程的任务是更新一个时间戳t1;
  • soft lock detector检查时间戳,如果超过soft lockup threshold一直未更新,说明[watchdog/x]未得到运行机会,意味着CPU长时间被霸占,也就是发生了soft lockup。

注意,内核线程[watchdog/x]的目的是更新时间戳,该时间戳是被watch的对象。而softlockup真正的看门狗(is_softlockup),则是由时钟中断触发的 watchdog_timer_fn()执行,[watchdog/x]是被scheduler调用执行的,而watchdog_timer_fn()则是被中断触发的。

Hardlockup

上面已经有了Softlockup,为什么还需要Hardlockup呢?我们知道softlockup依赖于时钟中断触发,那如果某个内核线程禁用了中断然后不释放cpu,Softlockup就失去了检测效果。

NMI watchdog会利用到之前讲到的hrtimer。它的触发条件是基于PMU(性能监视单元)的NMI perf event,当PMU的计数器溢出时会触发NMI中断,对应的中断处理例程是 kernel/watchdog.c: watchdog_overflow_callback(),hard lockup detector就在其中,它会检查上述hrtimer的中断(时钟中断)次数(hrtimer_interrupts)是否在保持递增,如果停滞则表明hrtimer中断未得到响应,也就是发生了hard lockup。

这里面,被watch的对象是hrtimer,而watchdog则是由PMU设备发起的NMI中断处理程序 watchdog_overflow_callback()

watchdog_overflow_callback是由函数perf_event_create_kernel_counter注册的一个硬件事件回调函数,这个硬件在x86里叫performance monitoring,此硬件有一个功能就是在cpu clock经过了多少个周期后发出一个NMI中断出来。
判断hardlockup的接口为is_hardlockup。

不同watchdog的区别与限制

1、硬件/dev/watchdog, 可解决大部分问题,但依赖于硬件定时器支持。
2、软件/dev/watchdog, 硬件不支持/dev/watchdog时可以使用软件dog。依赖于定时器中断实现,如果内核发生中断屏蔽异常,功能会失效。(依赖软件定时器,也会有一定性能影响?)
3、softlockup, 检测内核死锁问题。内核单个cpu执行线程发生死锁时,可以检测到。(由于依赖htimer触发,所以前提是时钟中断正常)
4、hardlockup, 检测发生硬件死锁异常。内核死锁且关闭了中断时触发。

其中3、4对性能有一定影响,是否开启,以及检测周期需要评估对性能影响。

容易混淆问题

1、[watchdogd]内核线程是和/dev/watchdog绑定的线程; [watchdog/x]是softlockup模块的任务线程。

[root@localhost ~]# ps aux|grep dog
root 15 0.0 0.0 0 0 ? S Sep28 0:01 [watchdog/0]
root 18 0.0 0.0 0 0 ? S Sep28 0:01 [watchdog/1]
root 24 0.0 0.0 0 0 ? S Sep28 0:01 [watchdog/2]
root 30 0.0 0.0 0 0 ? S Sep28 0:01 [watchdog/3]
root 55 0.0 0.0 0 0 ? S Sep28 0:00 [watchdogd]

2、/dev/watchdog*与//proc/sys/kernel/dog相关变量是没有关系的,后者是内核soft/hardlockup检测模块的控制接口。(不同接口对应关系可参考内核/kernel/watchdog.c代码)

参考资料:

https://qkxu.github.io/2019/04/15/linux%E4%B8%8B%E7%9A%84watchdog.html
qemu intel i6300esb watchdog虚拟外设分析
https://blog.csdn.net/vic_qxz/article/details/120888410

Linux内核中的Watchdog相关推荐

  1. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  2. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

  3. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  4. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  5. Linux内核中max()宏的奥妙何在?(一)

    Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...

  6. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  7. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  8. Linux 内核中的 GCC 特性(zz)

    from:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux ...

  9. 【Linux 内核】进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )

    文章目录 一.Linux 内核中的进程状态 二.TASK_RUNNING 状态 三.TASK_RUNNING 状态 四.TASK_UNINTERRUPTIBLE 状态 五.__TASK_STOPPED ...

最新文章

  1. np.nan is an invalid document, expected byte or unicode string
  2. http头部信息解析
  3. Redis requires a monkey patched socket library to work with gevent
  4. android 处理通话焦点,java – AUDIOFOCUS_LOSS在Android中打电话后打电话
  5. 深入分析Flex [Bindable] (总结)
  6. c语言学习-自定义函数并调用求1-100的累计和
  7. Mac 配置vscode调试PHP
  8. 电子商务新模式--4B
  9. java盛最多水的容器_Leetcode刷题java之11. 盛最多水的容器(top100)
  10. spark学习——(一)spark简介
  11. linux 消息队列API
  12. 【极学】托马斯的《生命不可承受之轻》
  13. 使用selenium获取网页源码
  14. java中使用MD5验证文件的完整性
  15. install package vif包_ggpubr: Publication Ready Plots (发表级质量的作图R包)
  16. kubesphere+kubernetes搭建生产环境高可用集群(一)
  17. C3P Software 发布 Cast-Designer V7.7版本
  18. java获取天气的方法
  19. 2021-2027全球与中国城市空中交通市场现状及未来发展趋势
  20. 藏书于海(共享图书)--适度

热门文章

  1. 洞见 SELENIUM 自动化测试
  2. wire tox_Tox-rs的漫长旅程。 第1部分
  3. css设置背景透明度,而不影响内部元素
  4. C++:应用有限差分法求解 稳平流扩散方程 v*ux-k*uxx=0 in 一个空间维度,具有恒定的速度 v 和扩散系数 k(附完整源码)
  5. sklearn专题五:逻辑回归
  6. Centos7 ping 不通百度 可能是网络配置问题
  7. socket接口技术和相关函数(socket,bind,listen,accept)
  8. JAVA - 变量作用域
  9. 计算机网络自顶向下第一章读书笔记
  10. 微软TTS语音引擎(中文)5.1