抢占模型选择
PREEMPT_DYNAMIC 允许同一个内核在启动时或运行时切换抢占模型,在吞吐与内核态延迟之间取舍。常见模型有 voluntary(只在自愿让出点抢占,偏吞吐)、full(内核态也可被抢占,延迟更低)与 none(除显式点外基本不抢占)。这项能力依赖内核编译时启用相应选项,并非所有发行版都开放运行时切换。查看时优先读调试文件系统,再结合内核配置判断。
基本信息
| 查看当前 | cat /sys/kernel/debug/sched/preempt(若支持) |
|---|---|
| 配置线索 | zcat /proc/config.gz | grep PREEMPT |
| 取舍 | full 降延迟、voluntary 偏吞吐 |
| 生效方式 | 启动参数或运行时切换,取决于内核 |
| 依赖 | 内核编译选项 |
典型使用场景
- 低延迟服务评估内核态抢占延迟
- 排查内核态长操作造成的抖动
- 确认机器实际使用的抢占模型
- 为不同角色的机器设计不同启动参数
- 与实时调度、核心隔离方案配合评估
查看当前配置
查看当前配置
cat /sys/kernel/debug/sched/preempt 2>/dev/null
zcat /proc/config.gz 2>/dev/null | grep -E 'CONFIG_PREEMPT'
cat /proc/cmdline | tr ' ' '\n' | grep -i preempt
uname -r
cyclictest -p 80 -t 1 -i 1000 -l 10000 2>/dev/null | tail -5
cat /sys/kernel/debug/sched/features 2>/dev/null | head抢占模型对照
| 模型 | 特点 | 适用场景 |
|---|---|---|
| full | 内核态也可被抢占,抢占延迟最低 | 延迟敏感、实时性要求高 |
| voluntary | 仅在自愿让出点抢占 | 吞吐优先的通用服务器 |
| none | 内核路径基本不抢占 | 极端吞吐场景,普通业务不建议 |
模型由内核编译与启动参数决定,并非所有发行版都开放运行时切换,操作前先确认当前配置。
更换模型影响全局稳定性与吞吐,非延迟刚需场景应保持发行版默认,避免引入难以归因的差异。
验证与落地方法
- 先用 uname -r 与内核配置确认特性是否被编入
- 用 cyclictest 等工具量化抢占延迟的改善幅度
- 在测试环境验证吞吐变化后再推广到生产
- 把启动参数纳入机器角色基线,避免同类机器之间配置漂移
抢占模型与实时调度策略是两件事:前者决定内核态能否被打断,后者决定用户态任务的优先级顺序,不要混为一谈。