Lockup,无论是Soft Lockup还是Hard Lockup,都会严重影响系统的稳定性和可靠性
本文旨在深入解析Linux ARM Lockup的成因、检测机制以及应对策略,为系统管理员和开发人员提供有价值的参考
一、Lockup现象概述 Lockup,即系统挂起,是指系统在某些情况下无法继续执行正常的指令流,导致系统无响应或崩溃
在Linux ARM环境中,Lockup现象尤为突出,因为ARM架构的设备广泛应用于嵌入式系统、移动设备等领域,这些设备对系统的实时性和稳定性要求极高
Lockup主要分为Soft Lockup和Hard Lockup两种类型: - Soft Lockup:指CPU被内核代码占据,导致其他进程无法执行
在Soft Lockup发生时,系统虽然无法执行新的任务,但仍然能够响应中断
- Hard Lockup:比Soft Lockup更为严重,CPU不仅无法执行其他进程,而且不再响应中断
Hard Lockup发生时,系统基本上处于完全无响应的状态
二、Lockup的成因 Linux ARM Lockup的成因多种多样,包括但不限于以下几点: 1.编程错误:如指针错误、未初始化的变量使用等,这些编程错误可能导致系统进入不稳定状态,进而引发Lockup
2.无限循环或死锁:程序陷入无限循环或由于资源争用导致死锁,使得处理器无法继续执行正常的指令流
3.堆栈溢出:堆栈空间被耗尽,导致堆栈溢出,进而引发Lockup
4.硬件故障:处理器或系统中的其他硬件组件出现故障,可能导致系统无法正常工作
5.资源耗尽:系统中的资源(如RAM、ROM或外设资源)被耗尽,系统无法继续执行
6.配置错误:系统的配置错误,如中断向量表被错误配置或损坏,可能导致系统无法正确响应中断
7.外部干扰:电源电压波动或电磁干扰等外部因素,也可能导致处理器进入Lockup状态
三、Lockup的检测机制 为了应对Lockup问题,Linux内核设计了一套检测机制,称为NMI Watchdog
NMI Watchdog利用NMI(Non-Maskable Interrupt,不可屏蔽中断)来实现对Lockup的检测,因为NMI中断是不可屏蔽的,即使在中断被屏蔽的状态下,NMI中断仍然可以得到执行
NMI Watchdog包括Soft Lockup Detector和Hard Lockup Detector两部分
它们的检测原理如下: - Soft Lockup Detector:为每个CPU分配一个定时执行的内核线程(watchdog/x),该线程具有最高的优先级(SCHED_FIFO实时进程,优先级为99)
如果watchdog/x线程在设定的期限内没有得到执行,就意味着发生了Soft Lockup
- Hard Lockup Detector:利用PMU(Performance Monitoring Unit,性能监控单元)的NMI perf event来检测
因为NMI中断是不可屏蔽的,所以在CPU不再响应中断的情况下,NMI中断仍然可以得到执行
NMI Watchdog会检查时钟中断的计数器(hrtimer_interrupts)是否在保持递增,如果停滞就意味着时钟中断未得到响应,即发生了Hard Lockup
在Linux内核的实现中,NMI Watchdog的触发机制包括两部分: 1.高精度计时器(hrtimer):对应的中断处理例程是`kernel/watchdog.c: watchdog_timer_fn()`
在该例程中,要递增计数器hrtimer_interrupts,供Hard Lockup Detector用于判断CPU是否响应中断;同时唤醒watchdog/x内核线程,该线程的任务是更新一个时间戳
Soft Lockup Detector检查时间戳,如果超过Soft Lockup阈值一直未更新,说明watchdog/x未得到运行机会,意味着CPU被霸占,即发生了Soft Lockup
2.基于PMU的NMI perf event:当PMU的计数器溢出时会触发NMI中断,对应的中断处理例程是`kernel/watchdog.c: watchdog_overflow_callback()`
Hard Lockup Detector就在其中,它会