hardlockup的原理说明
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的原理说明相关推荐
- softlockup检测(watchdog)原理(用于检测系统调度是否正常)
softlockup(watchdog)用于检测系统调度是否正常,即软锁的情况,当发生softlockup时,内核不能调度,但还能响应中断,对用户的表现可能为:能ping通,但无法登陆系统,无法进行正 ...
- softlockup原理分析
一.概述 Softlockup主要用于检查cpu上的任务是否有无法被调度的情况发生.其原理就是在cpu上创建一个实时FIFO优先级为99的percpu内核线程(一般情况下可以认为是系统中优先级最高的任 ...
- UUID的使用及其原理
今天敲项目要用UUID,想起之前老师告诉UUID的使用,但没说具体的生成逻辑,于是我进行了百度 首先,UUID的使用: //生成随机的UUID String uuid = UUID.randomUUI ...
- etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理
1. etcd 简介 etcd 官网定义: A highly-available key value store for shared configuration and service discov ...
- git原理及常见使用方法
Git 原理入门-来自阮一峰 Git 是最流行的版本管理工具,也是程序员的必备技能之一. 即使天天使用它,很多人也未必了解它的原理.Git 为什么可以管理版本?git add.git commit这些 ...
- 微机原理—定时计数控制接口
别看题目很高深,其实就是很简单的定时器和计数器而已. 通常用手机定个闹钟,就是定时器的使用. 工厂里通过传送带上安装传感器,传感器传输给计算机的信号用来计数. 这是一些很简单的应用,通过很小的一个芯片 ...
- 三层交换机原理:01路由器如何隔离广播域?
前言: 当网络规模较大的时候,需要设备来隔离广播域,防止网络中因产生广播风暴而导致网络效率降低,而二层交换机不能隔离广播域,所以需要三层路由器设备来隔离广播域! 但三层路由器为什么能够隔离广播域,是如 ...
- CRF(条件随机场)与Viterbi(维特比)算法原理详解
摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...
- BiLSTM-CRF学习笔记(原理和理解) 维特比
https://www.zhihu.com/question/20136144 维特比详解 BiLSTM-CRF 被提出用于NER或者词性标注,效果比单纯的CRF或者lstm或者bilstm效果都要好 ...
- 【Learning Notes】线性链条件随机场(CRF)原理及实现
1. 概述 条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminativ ...
最新文章
- 处理问题的方法--抽象和特例化
- R包reshape2,轻松实现长、宽数据表格转换
- mysql中int(15)和varchar(15)
- Lintcode: O(1) Check Power of 2
- 使用鸢尾花数据集实现一元逻辑回归、多分类问题
- php://input 如何用?
- Q100:怎么用三角形网格细分回旋体(rotational sweeping / revolution)
- NullableTypes for .NET
- spring源码之下载及构建
- swift中swiftNotice的pleaseWait()方法
- YGG Pilipinas: 台风奥黛特救灾工作更新
- Activiti,自定义表单,外置表单,工作流,微服务,子系统
- 某站弹幕抓取,视频,评论......
- 微信点餐系统——买家类目service层创建并测试通过
- 【转载】SpringBoot 接口数据加解密技巧,so easy!
- 平均年薪60.8万,Linux开发拿下这个证书有多吃香?
- 全国省份地区相关常量备忘
- 2016 ECCV-Gated Siamese Convolutional Neural Network Architecture for Human Re-ID
- nn.Upsample
- mex文件生成c语言,用C语言编写MEX文件.doc
热门文章
- 在 Docker 中使用 mysql 的一些技巧 1
- 不要着急改代码,先想想--centos 6.8下编译安装tmux
- Hibernate笔记①--myeclipse制动配置hibernate
- @Autowired与@Resource用法
- 程序开发基础学习五(json配置、解析文件,c++篇)
- 分析器错误 分析器错误信息: 类型“Websystem.Global”不明确: 它可能来自程序集...的解决...
- 15个mysql使用管理命令
- 蓝桥杯第五届JavaC组杨辉三角问题解决方法
- 使用Istio分布式跟踪应用程序
- Go Get设置代理