一、概述

Softlockup主要用于检查cpu上的任务是否有无法被调度的情况发生。其原理就是在cpu上创建一个实时FIFO优先级为99的percpu内核线程(一般情况下可以认为是系统中优先级最高的任务),其名字为watchdog;此任务一般会由一个高精度定时器htimer定期唤醒,唤醒后watchdog线程会去执行“喂狗”操作(具体而言就是将当前的时间戳写到变量watchdog_touch_ts)。同时,c这个htimer定时器还会定期检查此cpu上“喂狗”是否有发生,即判断当前时间戳与watchdog_touch_ts的差值是否大于一个门限,内核用get_softlockup_thresh()函数来取得此门限值,默认为20秒。 如果htimer定时器检测到watchdog_touch_ts距离现在已经超过了门限值就判断为发生了softlockup。
    触发softlockup的场景有许多种可能,例如在某个cpu上有优先级99的死循环FIFO任务;或者系统中有不健康的软中断在长时间进行软中断处理;又或者内核中产生了死循环等等。

二、检测原理

在上面已经了解到softlockup的检测依赖于两个对象:watchdog线程和定时器htimer。
    定时器htimer。 这个定时器的周期由内核中的变量sample_period来表示,默认为4秒。这个变量又由内核中的另外一个变量watchdog_thresh计算而来,其具体计算方式为:sample_period=watchdog_thresh * 2*(NSEC_PER_SEC/5),单位纳秒。内核中watchdog_thresh默认为10,用户可以通过/proc/sys/kernel/watchdog_thresh来指定。例如执行

echo 15 > /proc/sys/kernelwatchdog_thresh

后,sample_period的值,即定时器的周期就设置为6秒。
    当定时器到期后会调用htimer的时钟处理函数watchdog_timer_fn()做如下事情:
    (1) 唤醒watchdog线程;
    (2) 检查是否有发生softlockup;
    (3) 如果有发生softlockup则进行处理。
    这里第(2)步是如何检查是否有发生softlockup呢?原理就是检查上一次watchdog线程“喂狗”时距离现在的时间间隔是否超过了门限值softlockup_thresh,默认为20秒。其计算方式为softlockup_thresh=watchdog_thresh * 2。  上面已经提过watchdog_thresh默认为10,可通过/proc接口修改。

 

watchdog内核线程。 看门狗线程watchdog是由内核创建的percpu线程,创建后一直睡眠,然后等待htimer周期性的唤醒自己。被唤醒后watchdog线程就会去“喂狗”,即将当前时间戳写入到percpu变量watchdog_touch_ts中;

正常情况下每隔每隔sample_period秒的实际watchdog线程就会被唤醒一次,由于watchdog线程的优先级是实时FIFO调度策略99的优先级,因而它是系统中优先级最高的任务了。由于它首屈一指的高优先级,可以预测的是,唤醒后它会有机会立刻得到运行(除非系统中也有优先级为99的FIFO任务在运行状态),即去更新watchdog_touch_ts变量。因而,我们还可以预测,正常情况下watchdog_touch_ts每隔sample_period秒就会更新一次,或者说递增一次,递增的粒度也正好是htimer时钟的周期sample_period。

这种预测在何时可能不成立呢

(1) watchdog没有被及时唤醒。这种情况就是htimer没有及时触发;由于htimer唤醒是在高精度时钟中断中完成的,除非时钟中断出现问题,否则watchdog不会出现这种情况。而这种情况多半是长时间关闭本地中断造成的,这种情况一般需要通过hardlockup机制来检测;

(2) 系统中有长时间处于软中断处理函数。虽然watchdog线程优先级很高,但是只是任务级别的执行流,对于软中断执行流程是优先级更低的。假如系统中的有一个软中断由于某种原因进入到了死锁或者死循环,那么watchdog线程是无法执行的,这样watchdog_touch_ts也无法及时得到更新。

(3) cpu上有优先级为99的FIFO任务一直占有cpu。实时FIFO的调度策略是严格按优先级调度的,而同等优先级的任务遵守先来先运行、一直到无法再运行为止的原则。因而,如果cpu上原来已经有一个调度策略为FIFO且优先级为99的任务一直占有CPU时watchdog即使被唤醒后也是无法得到运行的。

这里列举了典型的三种watchdog无法及时获得cpu运行的情况,也就是发生soft lockup的典型情况,也就是说明此cpu有比FIFO99优先级相等或更高优先级的任务/模块在一直占用cpu。

三、softlockup的处理

一旦发生softlockup内核一般会有类似如下的打印:

# BUG: soft lockup - CPU#%d stuck for 22us! [loop:1023]

即softlockup的处理主要是打印告警信息以通知相关人员有相关情况发生。整个处理流程有如下几个部分:

(1) 通过soft_watchdog_warn判断是否已经发生过告警信息打印,则不再继续;

(2) 打印告警信息和current现场等等告警信息;

(3) 如果softlockup_all_cpu_backtrace变量使能,则打印其他各个cpu的堆栈回溯信息,这个变量可通过/proc/sys/kernel/softlockup_all_cpu_backtrace接口来enable/disable;

(4) 如果使能softlockup_panic变量,则进入panic。变量softlockup_panic可通过/proc/sys/kernel/softlockup_panic来修改。

softlockup原理分析相关推荐

  1. java signature 性能_Java常见bean mapper的性能及原理分析

    背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...

  2. Select函数实现原理分析

    转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...

  3. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  4. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...

  5. 原理分析_变色近视眼镜原理分析

    随着眼镜的发展,眼镜的外型变得越来越好看,并且眼镜的颜色也变得多姿多彩,让佩戴眼镜的你变得越来越时尚.变色近视眼镜就是由此产生的新型眼镜.变色镜可以随着阳光的强弱变换不同的色彩. 变色眼镜的原理分析 ...

  6. jieba分词_从语言模型原理分析如何jieba更细粒度的分词

    jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习.但有的时候发现分词的结果并不是自己最想要的.比如分词"重庆邮电大学",使用精确模式+HMM分词结果是[&quo ...

  7. EJB调用原理分析 (飞茂EJB)

    EJB调用原理分析 EJB调用原理分析 作者:robbin (MSN:robbin_fan AT hotmail DOT com) 版权声明:本文严禁转载,如有转载请求,请和作者联系 一个远程对象至少 ...

  8. 深入掌握Java技术 EJB调用原理分析

      深入掌握Java技术 EJB调用原理分析     一个远程对象至少要包括4个class文件:远程对象:远程对象的接口:实现远程接口的对象的stub:对象的skeleton这4个class文件. 在 ...

  9. 神经网络(NN)+反向传播算法(Backpropagation/BP)+交叉熵+softmax原理分析

    神经网络如何利用反向传播算法进行参数更新,加入交叉熵和softmax又会如何变化? 其中的数学原理分析:请点击这里. 转载于:https://www.cnblogs.com/code-wangjun/ ...

最新文章

  1. Windows驱动开发学习笔记(七)—— 多核同步内核重载
  2. 近期“速卖通母婴行业需求暴增”,带你了解母婴行业选品趋势
  3. 关于安装oracle 11G R2 for Windows X64问题
  4. mysql innodb的索引基本入门
  5. 【kafka】kafka 执行 多个脚本 kafka-run-class.sh 导致 server 节点 时不时挂掉
  6. 考驾照科目一考试很顺利
  7. 如何给一个文件重命名?
  8. Eclipse-project 重命名问题(如何彻底修改Eclipse工程名),4种解法
  9. centos java进程号_centos中分析java占用大量CPU资源的原因
  10. Excel根据身份证号提取省份
  11. 微信小程序富文本编辑器 editor 组件源码
  12. appium的环境安装与架构
  13. android timepicker 时间上限,利用Android TimePicker 和 DatePicker 实现对时间的限制
  14. python中的pandas库如何读数据_Python之Pandas库学习(二):数据读写
  15. Python Pandas实现简单Excel数据表合并
  16. HDU-5855 Less Time, More profit(最大权闭合图+二分)
  17. 剪不断理还乱--C#重载/重写/覆盖
  18. 【算法竞赛】力扣杯春赛-个人赛 LCCUP‘23复盘
  19. 强化学习 蒲丰投针实验 蒙特卡洛算法
  20. 基于STM32F429的语音识别交互系统

热门文章

  1. 【问题积累】printf 引发的内存越界问题
  2. android x86 v2ex,v2ex-android
  3. 服务器更新宕机-自我检讨
  4. 机器人卫士密码箱密码忘了怎么办_《忠诚的机器人卫士》教学设计(丽)
  5. 【Akka】Akka并发编程设计
  6. 转载本论坛 (fudan_abc ) :linux那些事儿之我是u盘(16)冰冻三尺非一日之寒
  7. 基于python和selenium爬取JD商城商品信息并且分析用户对于产品的满意程度
  8. SEO基础:Meta标签之Keywords、Description
  9. Java实现后端生成excel表格模板--下拉框实现
  10. 阿里巴巴与微软、苹果、亚马逊的实力对比