watchdog_timer:
expire time: 4s = (watchdog_threshold * 2) / 5(watchdog_threshold 由/proc/sys/kernel/watchdog_thresh配置,系统默认是10,下同)

function:updating hrtimer_interrupts when watchdog_timer expires

/|\

0         4         8     |  12        14        18
|-------|-------|-------|-------|-------|----
                             |
                             |
                             |
                             |
0                         10                             20
|-------------------|----------------------|
                     nmi_check
nmi:
expire time: 10s = watchdog_thresh    perf event的counter值也是由watchdog_thresh来确定;
function:nmi check
if(hrtimer_interrupts==hrtimer_interrupts_save)--->hard_lockup--->warning or crash
else hrtimer_interrupts_save = hrtimer_interrupts
 
       从上面可以看,理论上nmi check之前,watchdog会进行2-3次的喂狗操作,造成hardlockup的原因基本可以总结以下二点:
1:中断被关闭,长时间未打开,导致watchdog定时器中断不被响应,无法每4s一次喂狗,从而被nmi到时函数断定为hardlockup
2:由于nmi基于硬件cpu频率计时,如果频率不稳定或 Turbo-Mode被使能,突增变大,就可能会造成nmi检测提前,误报hardlockup。
针对2,开源合入了相应补丁,得到了很好的解释:
https://access.redhat.com/labs/psb/versions/kernel-3.10.0-862.el7/patches/kernel-watchdog-Prevent-false-positives-with-turbo-modes

补丁的思想:

由于喂狗操作会每4s进行一次,为了确保方式上述2情况的发生,此补丁引入了过滤器变量watchdog_hrtimer_sample_threshold=8s,此过滤器保证了,

至少有一次喂狗操作,然后利用这个变量在hardlockup检测前进行判断;

+static bool watchdog_check_timestamp(void)
+{
+ s64 delta, now = ktime_get_mono_fast_ns();
+
+ delta = now - __this_cpu_read(last_timestamp);//获取二个nmi检测的时间差
+ if (delta < watchdog_hrtimer_sample_threshold) {//如果时间差小于8s,说明了nmi时钟快了,防止误报,则不做检查!
+ /*
+ * If ktime is jiffies based, a stalled timer would prevent
+ * jiffies from being incremented and the filter would look
+ * at a stale timestamp and never trigger.
+ */
+ if (__this_cpu_inc_return(nmi_rearmed) < 10)
+ return false;//nmi检测直接返回,不做检查
+ }
+ __this_cpu_write(nmi_rearmed, 0);
+ __this_cpu_write(last_timestamp, now);
+ return true;
+}

hardlockup的原理说明相关推荐

  1. softlockup检测(watchdog)原理(用于检测系统调度是否正常)

    softlockup(watchdog)用于检测系统调度是否正常,即软锁的情况,当发生softlockup时,内核不能调度,但还能响应中断,对用户的表现可能为:能ping通,但无法登陆系统,无法进行正 ...

  2. softlockup原理分析

    一.概述 Softlockup主要用于检查cpu上的任务是否有无法被调度的情况发生.其原理就是在cpu上创建一个实时FIFO优先级为99的percpu内核线程(一般情况下可以认为是系统中优先级最高的任 ...

  3. UUID的使用及其原理

    今天敲项目要用UUID,想起之前老师告诉UUID的使用,但没说具体的生成逻辑,于是我进行了百度 首先,UUID的使用: //生成随机的UUID String uuid = UUID.randomUUI ...

  4. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理

    1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...

  5. git原理及常见使用方法

    Git 原理入门-来自阮一峰 Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些 ...

  6. 微机原理—定时计数控制接口

    别看题目很高深,其实就是很简单的定时器和计数器而已. 通常用手机定个闹钟,就是定时器的使用. 工厂里通过传送带上安装传感器,传感器传输给计算机的信号用来计数. 这是一些很简单的应用,通过很小的一个芯片 ...

  7. 三层交换机原理:01路由器如何隔离广播域?

    前言: 当网络规模较大的时候,需要设备来隔离广播域,防止网络中因产生广播风暴而导致网络效率降低,而二层交换机不能隔离广播域,所以需要三层路由器设备来隔离广播域! 但三层路由器为什么能够隔离广播域,是如 ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. BiLSTM-CRF学习笔记(原理和理解) 维特比

    https://www.zhihu.com/question/20136144 维特比详解 BiLSTM-CRF 被提出用于NER或者词性标注,效果比单纯的CRF或者lstm或者bilstm效果都要好 ...

  10. 【Learning Notes】线性链条件随机场(CRF)原理及实现

    1. 概述 条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminativ ...

最新文章

  1. 处理问题的方法--抽象和特例化
  2. R包reshape2,轻松实现长、宽数据表格转换
  3. mysql中int(15)和varchar(15)
  4. Lintcode: O(1) Check Power of 2
  5. 使用鸢尾花数据集实现一元逻辑回归、多分类问题
  6. php://input 如何用?
  7. Q100:怎么用三角形网格细分回旋体(rotational sweeping / revolution)
  8. NullableTypes for .NET
  9. spring源码之下载及构建
  10. swift中swiftNotice的pleaseWait()方法
  11. YGG Pilipinas: 台风奥黛特救灾工作更新
  12. Activiti,自定义表单,外置表单,工作流,微服务,子系统
  13. 某站弹幕抓取,视频,评论......
  14. 微信点餐系统——买家类目service层创建并测试通过
  15. 【转载】SpringBoot 接口数据加解密技巧,so easy!
  16. 平均年薪60.8万,Linux开发拿下这个证书有多吃香?
  17. 全国省份地区相关常量备忘
  18. 2016 ECCV-Gated Siamese Convolutional Neural Network Architecture for Human Re-ID
  19. nn.Upsample
  20. mex文件生成c语言,用C语言编写MEX文件.doc

热门文章

  1. 在 Docker 中使用 mysql 的一些技巧 1
  2. 不要着急改代码,先想想--centos 6.8下编译安装tmux
  3. Hibernate笔记①--myeclipse制动配置hibernate
  4. @Autowired与@Resource用法
  5. 程序开发基础学习五(json配置、解析文件,c++篇)
  6. 分析器错误 分析器错误信息: 类型“Websystem.Global”不明确: 它可能来自程序集...的解决...
  7. 15个mysql使用管理命令
  8. 蓝桥杯第五届JavaC组杨辉三角问题解决方法
  9. 使用Istio分布式跟踪应用程序
  10. Go Get设置代理