原帖地址:

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

  • 首先只有内核代码才能引起lockup,因为用户代码是可以被抢占的,不可能形成lockup(只有一种情况例外,就是SCHED_FIFO优先级为99的实时进程即使在用户态也可能使[watchdog/x]内核线程抢不到CPU而形成soft lock,参见《Real-Time进程会导致系统Lockup吗?》)
  • 其次内核代码必须处于禁止内核抢占的状态(preemption disabled),因为Linux是可抢占式的内核,只在某些特定的代码区才禁止抢占,在这些代码区才有可能形成lockup。

Lockup分为两种:soft lockup 和 hard lockup,它们的区别是 hard lockup 发生在CPU屏蔽中断的情况下。

  • Soft lockup是指CPU被内核代码占据,以至于无法执行其它进程。检测soft lockup的原理是给每个CPU分配一个定时执行的内核线程[watchdog/x],如果该线程在设定的期限内没有得到执行的话就意味着发生了soft lockup,[watchdog/x]是SCHED_FIFO实时进程,优先级为最高的99,拥有优先运行的特权。
  • Hard lockup比soft lockup更加严重,CPU不仅无法执行其它进程,而且不再响应中断。检测hard lockup的原理利用了PMU的NMI perf event,因为NMI中断是不可屏蔽的,在CPU不再响应中断的情况下仍然可以得到执行,它再去检查时钟中断的计数器hrtimer_interrupts是否在保持递增,如果停滞就意味着时钟中断未得到响应,也就是发生了hard lockup。

Linux kernel设计了一个检测lockup的机制,称为NMI Watchdog,是利用NMI中断实现的,用NMI是因为lockup有可能发生在中断被屏蔽的状态下,这时唯一能把CPU抢下来的方法就是通过NMI,因为NMI中断是不可屏蔽的。NMI Watchdog 中包含 soft lockup detector 和 hard lockup detector,2.6之后的内核的实现方法如下。

NMI Watchdog 的触发机制包括两部分:

  1. 一个高精度计时器(hrtimer),对应的中断处理例程是kernel/watchdog.c: watchdog_timer_fn(),在该例程中:

    • 要递增计数器hrtimer_interrupts,这个计数器供hard lockup detector用于判断CPU是否响应中断;
    • 还要唤醒[watchdog/x]内核线程,该线程的任务是更新一个时间戳;
    • soft lock detector检查时间戳,如果超过soft lockup threshold一直未更新,说明[watchdog/x]未得到运行机会,意味着CPU被霸占,也就是发生了soft lockup。
  2. 基于PMU的NMI perf event,当PMU的计数器溢出时会触发NMI中断,对应的中断处理例程是 kernel/watchdog.c: watchdog_overflow_callback(),hard lockup detector就在其中,它会检查上述hrtimer的中断次数(hrtimer_interrupts)是否在保持递增,如果停滞则表明hrtimer中断未得到响应,也就是发生了hard lockup。

hrtimer的周期是:softlockup_thresh/5。
注:

  • 在2.6内核中:
    softlockup_thresh的值等于内核参数kernel.watchdog_thresh,默认60秒;
  • 而到3.10内核中:
    内核参数kernel.watchdog_thresh名称未变,但含义变成了hard lockup threshold,默认10秒;
    soft lockup threshold则等于(2*kernel.watchdog_thresh),即默认20秒。

NMI perf event是基于PMU的,触发周期(hard lockup threshold)在2.6内核里是固定的60秒,不可手工调整;在3.10内核里可以手工调整,因为直接对应着内核参数kernel.watchdog_thresh,默认值10秒。

检测到 lockup 之后怎么办?可以自动panic,也可输出条信息就算完了,这是可以通过内核参数来定义的:

  • kernel.softlockup_panic: 决定了检测到soft lockup时是否自动panic,缺省值是0;
  • kernel.nmi_watchdog: 定义是否开启nmi watchdog、以及hard lockup是否导致panic,该内核参数的格式是”=[panic,][nopanic,][num]”.
    (注:最新的kernel引入了新的内核参数kernel.hardlockup_panic,可以通过检查是否存在 /proc/sys/kernel/hardlockup_panic来判断你的内核是否支持。)

参考资料:

Softlockup detector and hardlockup detector (aka nmi_watchdog)

kernel/watchdog.c:
设置PMU NMI perf event的代码 wachdog_nmi_enable()
响应NMI perf overflow中断的代码 watchdog_overflow_callback()
[watchdog/x]内核线程 watchdog()
响应hrtimer中断的代码 watchdog_timer_fn()

内核如何检测soft lockup与hard lockup?相关推荐

  1. 首届中国eBPF大会分享---基于eBPF的内核漏洞检测实践

    背景 随着智能化.数字化.云化的飞速发展,全球基于Linux系统的设备数以百亿计,而这些设备的安全保障主要取决于主线内核的安全性和健壮性.传统的内核安全存在周期长.效率低以及版本适配的问题,有没有实用 ...

  2. Linux内核内存检测工具KASAN

    KASAN ['kæzən] KASAN 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题.KASAN ...

  3. 内存管理 内核内存检测KASAN

    一.简介: Kasan 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题.KASAN可以检测的内存异常包 ...

  4. linux内核内存检测方法实践手记

    前言 一.slub_debug是什么? 说明:在linux内核中,小块内存分配使用slab/slub分配器,slab/slub分配器提供内存检测功能.主要检测如下功能: 访问已经释放的内存 越界访问 ...

  5. linux栈溢出检测方法有哪些,Linux内核栈溢出检测

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 借助Linux debugfs来检测内核栈使用状态及溢出检测 工具 Linux内核中有KASAN和kmemcheck K ...

  6. linux内核死锁检测机制 | oenhan,Linux内核CPU负载均衡机制 | OenHan

    还是神奇的进程调度问题引发的,参看Linux进程组调度机制分析,组调度机制是看清楚了,发现在重启过程中,很多内核调用栈阻塞在了double_rq_lock函数上,而double_rq_lock则是lo ...

  7. Linux内核死锁检测工具——Lockdep

    文章目录 前言 配置内核 简单的AB-BA死锁案例 实际项目中的死锁 前言 死锁是指两个或多个进程因争夺资源而造成的互相等待的现象,如进程A需要资源X,进程B需要资源Y,而双方都掌握对方所需要的资源, ...

  8. NMI watchdog: BUG: soft lockup - CPU#2 stuck for 23s!

    <NMI watchdog: BUG: soft lockup> <kernel:NMI watchdog: BUG: soft lockup - CPU#6 stuck for 2 ...

  9. 请记住内核中这个勤劳的监测卫士---Watchdog(Soft lockup篇)

    ​更多内核安全.eBPF分析和实践文章,请关注博客和公众号: CSDN博客:内核功守道 公众号: 内核功守道 背景 从内核稳定性问题的角度来看内核安全,是基础,也是必备技能.很多时候,一个内核稳定性问 ...

  10. linux内核中watchdog、lockup、stall、hung等检测

    目录 lockup 一.watchdog看门狗 二.soft /hard  lockup 1.soft lockup 2.hard lockup 三.kernel's hung task 四.work ...

最新文章

  1. java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏
  2. 报Java面授班有哪些优势
  3. matlab仿真谱间干扰,内外分解和谱分解问题解析计算及其MATLAB仿真.pdf
  4. 庖丁解牛迭代器,聊聊那些藏在幕后的秘密 1
  5. arduino出现java错误_arduino在上传的时候出现这样的错误,在线求助大神!!!
  6. websocket与ajax的区别浅析
  7. Spring MVC中jsessionid所引起的问题 和解决
  8. startindex 不能大于字符串长度_玩转云端丨redis的5种对象与8种数据结构之字符串对象(下)...
  9. C语言:学生信息管理程序
  10. python类型错误:can only concatenate list (not str) to list
  11. SqlServer的分割函数
  12. 对麦克纳姆轮辊子的理解
  13. 深入理解socket编程的几个函数和两种fd
  14. 部署项目在Tomcat出现,tomcat报错More than one fragment with the name [org_apache_tomcat_websocket]
  15. 二阶偏微分方程matlab解答,二阶椭圆偏微分方程实例求解(附matlab代码).docx
  16. 小米5安装googleplay框架
  17. 今天做了一下chinaitlab上面的CCNA试题!
  18. 国家集训队 矩阵乘法
  19. 电池革命:固态电池量产还有多远?
  20. iOS开发APP瘦身之PDF图片资源加载框架

热门文章

  1. 解决ASP.NET页面回车回发的问题
  2. Java基本类型与类型转换咋就这么烦?
  3. 韦东山驱动视频笔记——6.输入子系统之编写驱动程序
  4. 【C#】使用OWIN创建Web API
  5. Sql server 数量累计求和
  6. 备忘录 | 当我每晚闲暇时我在干什么(1)
  7. 用Markdown格式写一份前端简历
  8. MySQL常用命令收录
  9. SAP-PP后台配置(第二部分)
  10. 今天看了《一声叹息》