1.Linux softlockup和hardlockup的部分参数解析
2.linuxå¦ä½è®¾ç½®biosä¸watchdog
3.Linux内核调试之hung_task机制及案例分析
4.Linux内核看门狗守护者linux内核看门狗
5.Linux时间子系统之:时钟源
Linux softlockup和hardlockup的部分参数解析
Softlockup和hardlockup作为内核中的"lockup-看门狗"功能,用于监测系统中调度和中断是否正常运行。这两种watchdogs在/proc/sys/kernel/目录下提供了一些配置参数,用于控制和调整其功能。
Lockup-watchdog通过周期性采样来执行检查。Softlockup和hardlockup的大喜大指标源码采样源和周期不同。接下来,我们将探讨它们的采样周期。
2.1 softlockup检查周期
Softlockup的检查周期存储在一个全局变量sample_period中,该变量在lockup-watchdog初始化时通过调用lockup_detector_reconfigure()函数计算得到。通过这部分计算代码可以看出,sample_period=watchdog_thresh*2/5。
2.2 hardlockup检查周期
Hardlockup的检查周期在PMU event创建时确定。从这个角度来看,hardlockup的perf event采样周期为cpu_khz* * watchdog_thresh。其中:cpu_khz是CPU主频/,CPU主频即每秒cycle数。因此,PMU cycles按此频率采样,麻将源码俱乐部就是watchdog_thresh秒。
三 门限
首先,以表格形式查看softlockup和hardlockup两种lockup-watchdog的门限。
3.1 softlockup门限
Softlockup门限是watchdog_thresh*2,其中watchdog_thresh可以通过/proc/sys/kernel/watchdog_thresh进行配置。因此,softlockup门限的默认值是秒。
3.2 hardlockup门限
默认情况下,如果时钟中断秒没有更新,就会触发hardlockup。但是,在CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y的情况下,如果NMI的cycles在turbo模式下cycles比墙上时间算起来要快,可能导致检查不到秒就引发伪hardlockup。因此,在这种情况下,需要一个保证机制,至少要超过8秒才会发起hardlockup的商城分享源码检查。这个8秒是通过以下方式计算的。
四 保活周期
以下是关于softlockup和hardlockup"保活"周期的分析。
4.1 softlockup保活
Softlockup通过Linux中优先级最高的调度类中stop worker来进行保活;这个stop worker线程以sample_period为周期被hrtimer触发,sample_period也就是2.1中的softlockup检查周期。这个stop worker被触发后会更新watchdog_touch_ts这个每CPU变量:__this_cpu_write(watchdog_touch_ts, get_timestamp())
4.2 hardlockup保活
Hardlockup会有一个sample_period为周期的hrtimer反复触发去更新hrtimer_interrupts这个每CPU变量:__this_cpu_inc(hrtimer_interrupts)。此外,这个hrtimer也就是4.1中触发stop worker的hrtimer,没错,他们是复用的。
总结
本文以linux-5.代码为背景进行分析。分析线条不是按照lockup-watchdog的工作流程来介绍,而是着重对一些参数进行了分析,以便后续工作中引用。
linuxå¦ä½è®¾ç½®biosä¸watchdog
linuxå æ ¸éé¢å°±æè¿ä¸ªæ¨¡åï¼ä½ ççç¼è¯å æ ¸çæ¶åççæ没æç¼è¯è¿å»ï¼make menuconfigéé¢æ¾æ¾ï¼æè ç´æ¥ä».configéé¢å»æ¾ï¼åªè¦watchdog模åå¼å ³æå¼ å°±ä¼ç¼è¿å æ ¸ç
Linux内核调试之hung_task机制及案例分析
本文详细阐述Linux内核中的Softlockup、Hardlockup及Hung_task机制,并通过Ubuntu虚拟机案例深入分析内核态的Hung_task。使用Crash工具分析推导关键参数值,复原系统崩溃时的弹幕JS源码栈信息。
Softlockup与Hardlockup机制,又称nmi_watchdog,是Linux内核实现的一种检测系统发生Softlockup和Hardlockup的看门狗机制。Softlockup是内核循环过长,导致其他任务无法运行的错误;Hardlockup则是循环过长,中断无法运行的情况。通过sysctl命令、启动参数以及内核编译选项配置,可选择在检测到相应情况后进入panic状态。
Softlockup与Hardlockup机制基于hrtimer(高精度定时器)和perf两个子系统实现,配置调整涉及时间间隔的设置。内核通过定时器和中断检测循环状态,为检测响应速度与开销间权衡提供了调节空间。对于特定使用场景,合理配置周期值至关重要。
Hung_task机制识别长时间处于不可中断状态(TASK_UNINTERRUPTIBLE)的进程,通过创建内核线程定期检查系统中是否存在此类进程。如果存在且超过指定时间,天天调查源码将打印警告和进程堆栈,若配置了hung_task_panic,将直接发起panic。
实验案例中,通过增加down_read(sem)与down_write(sem)导致hung_task现场,引起内核重启。Makefile文件内容展示了模块编译过程。内核崩溃后,通过加载转储文件、查看调用关系、使用ps命令查找进程状态,最终通过反汇编与栈帧分析,推导出崩溃原因及关键参数值,完成对内核崩溃的深入解析。
Linux内核看门狗守护者linux内核看门狗
Linux内核是一个操作系统内核,被用于各种日常用途,尤其是在服务器端应用上更加受欢迎。Linux内核除了支持通用操作系统功能外,还提供了一个叫做”看门狗”(Watchdog)的守护子系统。这是一个可编程的微控制器,它的作用是及早检测操作系统的异常情况,并给出适当的响应措施,保护操作系统不因异常情况而出现问题。
看门狗是一个类似于程序的硬件实体,挂载在计算机主板上或操作系统内核中,在一段固定时间内它将定期主动检查操作系统是否出现异常情况,可能是进程崩溃、硬件损坏、数据损失等,一旦检测到异常情况则自动采取措施,重新启动计算机、重置目前运行的进程或硬件设备等。
Linux内核的看门狗子系统是一个可配置的模块,它可以用来检测操作系统状态以及定期给出响应措施。它有助于保护操作系统不出现异常状态。例如,一段代码可以用来重启当前主机:
watchdog_timer = 0;
while (1) {
// 检查操作系统状态
if ( check_system_status() == FAILED ) {
// 如果未恢复则重启
watchdog_timer += 1;
if (watchdog_timer >= 3) {
// 如果时间超过3次重启
reboot();
}
} else {
// 如果恢复,重新计时
watchdog_timer = 0;
}
}
由上可见看门狗的作用及重要性,它的工作简单易懂但却是Linux内核的一个重要组成部分,在很多关键性的任务中发挥着重要角色,可以说”看门狗”是Linux内核安全系统中的守护者,保护数据安全并完善操作系统稳定性。
Linux时间子系统之:时钟源
探索Linux内核的时间奥秘:时钟源的精密构建在Linux内核的精密世界里,时钟源扮演着时间基准的角色,它像一台隐形的精确计时器,通过硬件计数器确保我们与时间的精准同步。struct clocksource是这个系统的核心结构,其中的关键组件,如rating(精度,范围1-,数值越高,时间精度越优)、read回调,以及mult和shift,共同构建了这个时间测量的基石。rating值在1-范围内用于特殊用途,而-区间则为常规选择,read函数则是时间计数的窗口,mult和shift则是处理计数与频率F之间转换的魔力公式,内核采用位精度进行计算。
为了确保时间更新的稳定性和准确性,clocksource_register_hz在初始化时,通过一系列复杂的计算,确定了mult、shift的值,并为最大闲置时间设定了限制。同时,clocksource_register_scale负责性能排序和监控,而watchdog就像一个警惕的眼睛,一旦发现性能偏差超出阈值,就会标记该时钟源为不稳定状态。 在Linux启动的早期阶段,系统首先注册基于jiffies的clocksource,尽管其评级较低,但这正是基础中的基础。想要深入了解这个时钟源体系的更多细节,你可以在Linux内核源码分析学习群中发现丰富的资源。 深入理解clocksource的运作机制- clocksource_jiffies结构体,其设计为每个时钟周期提供1/HZ秒的精度,评级为1,是默认选择,除非有特定需求,否则系统会采用这个基础时钟源。
- init_jiffies_clocksource函数是初始化和注册这个时钟源的关键步骤,它确保了clocksource_jiffies的顺利启动。
- clocksource_default_clock提供了一种可选的默认时钟源,通常设置为clocksource_jiffies,但在特定场景下,可以被自定义以适应特定需求。
- clocksource_done_booting则在系统启动的后期,根据系统的实际情况,选择最合适的clocksource,并通知timekeeping系统进行适时的时间更新,确保系统时间的精准与一致性。
在这个看似简洁的时间管理背后,Linux内核的时钟源系统蕴含着精细的逻辑与优化,每个组件都在默默地守护着系统的稳定和准确性。深入理解这些细节,对于任何想要驾驭Linux内核的开发者来说,无疑是一把打开时间秘密的钥匙。