首页/系统/Linux 内核与性能调优速查/PREEMPT_DYNAMIC 抢占模型
CPU 与调度60 条

PREEMPT_DYNAMIC 抢占模型

PREEMPT_DYNAMIC 允许同一内核在启动时或运行时切换抢占模型(voluntary/full 等),在吞吐与内核态延迟间取舍。

抢占模型选择

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 等工具量化抢占延迟的改善幅度
  • 在测试环境验证吞吐变化后再推广到生产
  • 把启动参数纳入机器角色基线,避免同类机器之间配置漂移
抢占模型与实时调度策略是两件事:前者决定内核态能否被打断,后者决定用户态任务的优先级顺序,不要混为一谈。

易错点

  • 以为可以随意运行时切换:很多内核只支持启动时选择
  • 未确认配置就改启动参数:特性可能根本没编入内核
  • 只改模型不看吞吐:切到 full 后吞吐可能明显下降
  • 只看模型名称不做实测:延迟收益应用 cyclictest 等工具验证
  • 多台同角色机器参数不一致:行为差异会让问题难以复现

数据来源与参考

  • Linux 内核 Documentation/admin-guide/preempt-variants 说明
  • Linux 内核配置选项文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌