Skip to main content
 首页 » 操作系统

Linux 调度器之相关DEBUG汇总

2022年07月19日146lautakyan007

一、基础理论概述

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: 可有用来检查是否有进程长时间处于阻塞状态。

本文参考链接:https://www.cnblogs.com/hellokitty2/p/16212629.html