RHEL8/9: CONFIG_PREEMPT_COUNT=y

张开发
2026/4/19 2:05:26 15 分钟阅读

分享文章

RHEL8/9: CONFIG_PREEMPT_COUNT=y
/boot/config-5.14.0-570.21.1.el9_6.x86_64:CONFIG_PREEMPT_COUNTy这个配置在RHEL8没有设置而在RHEL9设置了这个有什么区别有什么性能区别配置差别还挺大这个可能遇到性能问题的时候需要考虑的一个点。[rootVMTCA~]# grep CONFIG_PREEMPT/boot/config-4.18.0-553.71.1.el8_10.x86_64|grep-v \# CONFIG_PREEMPT_NOTIFIERSy CONFIG_PREEMPT_VOLUNTARYy $ grep CONFIG_PREEMPT/boot/config-5.14.0-570.52.1.el9_6.x86_64|grep-v \# CONFIG_PREEMPT_BUILDy CONFIG_PREEMPT_VOLUNTARYy CONFIG_PREEMPT_COUNTy CONFIG_PREEMPTIONy CONFIG_PREEMPT_DYNAMICy CONFIG_PREEMPT_RCUy CONFIG_PREEMPT_NOTIFIERSyCONFIG_PREEMPT_COUNTy 在CONFIG_PREEMPT_COUNTy 在 RHEL9 中启用而 RHEL8 中未启用主要区别在于内核的抢占模型这会影响系统的实时性、响应速度和整体性能。CONFIG_PREEMPT_COUNT 是 Linux 内核配置中的一个选项它启用了一个机制来跟踪内核是否可以安全地被抢占。抢占计数 (Preemption Count): 内核维护一个“抢占计数器”。当内核代码进入一个不可抢占的区域例如持有自旋锁、禁用中断、或在临界区内时这个计数器会增加。当离开这些区域时计数器会减少。只有当抢占计数器为零时内核才允许被抢占。目的: 确保内核在执行关键操作时不会被中断或抢占从而避免数据损坏和竞态条件。RHEL8 与 RHEL9 的区别RHEL8 (通常不启用 CONFIG_PREEMPT_COUNTy): 默认情况下RHEL8 的内核通常采用的是更传统的抢占模型例如 CONFIG_PREEMPT_VOLUNTARY 或 CONFIG_PREEMPT_NONE。这意味着内核代码在某些情况下会运行更长时间而不被抢占或者只在明确的抢占点才允许抢占。RHEL9 (启用 CONFIG_PREEMPT_COUNTy): 启用 CONFIG_PREEMPT_COUNTy 通常与更积极的抢占模型如 CONFIG_PREEMPT_FULL 或 CONFIG_PREEMPT_RT 相关的特性结合使用。这意味着 RHEL9 的内核设计为在更多情况下可以被抢占以提供更好的实时性和更低的延迟。启用 CONFIG_PREEMPT_COUNTy 对性能的影响是多方面的实时性与响应速度提升:更低的延迟: 内核可以在更细粒度上被抢占这意味着高优先级的任务可以更快地中断正在执行的低优先级内核代码从而显著降低任务调度延迟和中断响应时间。更好的实时性能: 对于需要严格时间保证的应用程序如工业控制、金融交易、音视频处理等RHEL9 提供的内核可能更具确定性。吞吐量可能略有下降:上下文切换开销: 更频繁的抢占意味着更多的上下文切换。每次上下文切换都会带来一定的 CPU 开销保存和恢复寄存器、刷新缓存等。抢占检查开销: 内核需要不断检查抢占计数器和是否有更高优先级的任务等待运行这也会增加少量开销。对于纯粹的 CPU 密集型、非实时工作负载这些额外的开销可能导致整体吞吐量略有下降。更复杂的内核代码: 实现细粒度抢占需要更复杂的内核同步机制和更严格的编程规范以确保所有临界区都正确地被保护。潜在的调试挑战: 在某些极端情况下更积极的抢占模型可能会暴露出一些在非抢占内核中不明显的问题但这些通常在发行版发布前已经过严格测试。RHEL9 启用 CONFIG_PREEMPT_COUNTy 旨在提供一个更具响应性和实时性的内核。对于大多数通用服务器工作负载性能差异可能不明显甚至在某些纯吞吐量测试中可能略有下降。然而对于对延迟敏感或有实时性要求的应用RHEL9 的内核配置将提供显著的优势。

更多文章