zoukankan      html  css  js  c++  java
  • linux 内核Lockup机制浅析

    概念说明

    Linux内核Lockup就是linux内核占用CPU不放,Lockup分为两种:soft lockup 和 hard lockup。

    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/watchdog.c中,

    主体涉及到了3个东西:kernel线程,时钟中断,NMI中断(不可屏蔽中断)。

    这3个东西具有不一样的优先级,依次是kernel线程 < 时钟中断 < NMI中断。

    检测机制

    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]”.

    参考: https://www.kernel.org/doc/Documentation/lockup-watchdogs.txt

  • 相关阅读:
    关于Adobe CS3套装的"此产品的许可已停止" 的解决方案
    Activity的生命周期 二
    APICS与AX的Master Planning(二)Rescheduling Assumption 重排假设
    COMVariantType的Date类型
    APICS与AX的Master Planning(一)Phantom bill of Material 虚项
    APICS与AX的Master Planning(四)Time Fence时限(时界)
    APICS与AX的Master Planning(三)Firm Planned Orders已确认计划订单
    设定Access数据库自增长字段初始
    SQL Server数据库导入导出数据方式比较
    个性博客七款超靓天气预报免费代码
  • 原文地址:https://www.cnblogs.com/jerry116/p/8799355.html
Copyright © 2011-2022 走看看