linux- spinlock 相关DEBUG汇总


一、基础理论概述
1. 有三种 preemption model 和适用场景
非强占式内核(服务器)
强占式内核(低延迟桌面)
voluntary kernel preemption(桌面)
2. 动态功耗 = C * Freq * Voltage^2  其中Freq 是CPU运行频率,Voltage是CPU核心的电压
3. RT和DL视角下的负载均衡:n个runnable的RT task平均分配在n个处理器上。当一个CPU上有2个以上的RT task的时候被称为overload。
4. 任务虚拟时间 = 任务物理时间 * nice=0的权重/任务权重
5. /proc/sys/kernel/sched_rt_runtime_us 中显示的950ms表示1s内允许每个CPU上的RT任务运行950ms,若一个CPU上的时间耗尽后可以借用其它CPU的时间。
6. CPU idle子系统通过 lpm governor 来选择idle governor
 
二、Lockup_detector
背景:LOCKUP_DETECTOR 是内核的一个调试选项,其可以探测到soft lockup与hard lockup,其主要涉及到kernel线程、时钟中断、NMI中断。
soft lockup: 进程抢占被长时间关闭而导致的进程无法调度。
hard lockup: 中断被长时间关闭而导致的更严重的问题。
注:hard lockup的监测依赖硬件支持,目前Qcom平台还不支持NMI,所以无法使用 CONFIG_HARDLOCKUP_DETECTOR 来调试hard lockup。而soft lockup是软件机制,Qcom内核中为每个CPU创建一个叫watchdog的线程,其优先级非常高,若是一定时间没有被调到到,就认为CPU卡死了。
需要使能:CONFIG_LOCKUP_DETECTOR=y
直接看dmesg中检索 "soft lockup" 查看即可。
 
三、死锁检测 Lockdep
1. 作用:用于调试内核空间中的死锁问题。
需要使能:
CONFIG_PROVE_LOCKING=y
CONFIG_DEBUG_LOCK_ALLOCK=y
CONFIG_DEBUG_LOCKDEP=y
CONFIG_LOCK_STAT=y
CONFIG_DEBUG_LOCKING_API_SELFTESTS=y
出现死锁后,监测到死锁后,在kernel log中可以看到死锁类型,死锁描述(欲持锁点和已持锁点),死锁时尝试持锁位置和之前被持有的位置。
2. 内核还提供了一些其它debug死锁的方法:

CONFIG_DEBUG_MUTEXES: 可以用来调试mutex死锁。
CONFIG_DEBUG_SPINLOCK: 可以用来调试spinlock死锁。
CONFIG_DEBUG_LOCK_ALLOC: 可以用来检查锁是否被异常释放(包含mutex spin rwlock rwsem)。
CONFIG_DEBUG_ATOMIC_SLEEP: 可以用来检查是否在原子上下文中使用might_sleep相关操作。
CONFIG_SCHED_STACK_END_CHECK: 可以用来检查栈是否溢出。
CONFIG_DETECT_HUNG_TASK: 可有用来检查是否有进程长时间处于阻塞状态。
posted @ 2022-07-06 19:35  zxiaocheng  阅读(803)  评论(0编辑  收藏  举报