配置Linux内核时了解RCU

Dev*_*son 4 compiling kernel configuration linux-kernel

我正在配置 Linux 内核版本 3.9.4。我被问到有关 RCU 的问题(见下文)。具体来说,这些分别是什么以及启用或禁用其中一些的优点和缺点是什么?

Consider userspace as in RCU extended quiescent state (RCU_USER_QS) [N/y/?]
Tree-based hierarchical RCU fanout value (RCU_FANOUT) [64]
Disable tree-based hierarchical RCU auto-balancing (RCU_FANOUT_EXACT) [N/y/?]
Accelerate last non-dyntick-idle CPU's grace periods (RCU_FAST_NO_HZ) [Y/n/?]
Offload RCU callback processing from boot-selected CPUs (RCU_NOCB_CPU) [N/y/?] 
Run Code Online (Sandbox Code Playgroud)

slm*_*slm 9

LTTng 项目网站上有关于这些选项的一些详细信息。RCU 是(读取-复制-更新)。这些是内核中的数据结构,允许在多核 CPU 中跨内核复制相同的数据,并保证数据在副本之间保持同步。

摘抄

liburcu 是一个 LGPLv2.1 用户空间 RCU(读取-复制-更新)库。此数据同步库提供读取端访问,可随内核数量线性扩展。它通过允许给定数据结构的多个副本同时存在,并通过监视数据结构访问以检测可以进行内存回收的宽限期来实现这一点。

资源

那么这些选项是什么呢?

此选项在内核/用户空间边界上设置挂钩,并在 CPU 在用户空间中运行时将 RCU 置于扩展静止状态。这意味着当 CPU 在用户空间中运行时,它被排除在全局 RCU 状态机之外,因此不会尝试为 RCU 保持计时器滴答。

除非您想破解并帮助开发完整的 dynticks 模式,否则不应启用此选项。它还增加了不必要的开销。

如果不确定说 N

此选项控制 RCU 分层实现的扇出,允许 RCU 在具有大量 CPU 的机器上高效工作。这个值必须至少是 NR_CPUS 的第四个根,这使得 NR_CPUS 非常大。RCU_FANOUT 的默认值应该用于生产系统,但如果您正在对 RCU 实现本身进行压力测试,则较小的 RCU_FANOUT 值允许您在较小的系统上测试大型系统代码路径。

如果测试 RCU 本身,请选择一个特定的数字。如果不确定,请使用默认值。

该选项强制使用指定的确切 RCU_FANOUT 值,而不管层次结构中的不平衡。这对于测试 RCU 本身很有用,并且有一天可能对具有强大 NUMA 行为的系统有用。

如果没有 RCU_FANOUT_EXACT,代码将平衡层次结构。

如果不确定,请说 N。

该选项允许 CPU 进入 dynticks-idle 状态,即使它们有 RCU 回调排队,并防止 RCU 大约每四个 jiffies 唤醒这些 CPU 一次(默认情况下,您可以使用 rcutree.rcu_idle_gp_delay 参数进行调整),从而提高能源效率。另一方面,此选项会增加 RCU 宽限期的持续时间,例如,减慢 synchronized_rcu()。

如果能源效率非常重要,并且您不关心增加的宽限期持续时间,请说 Y。

如果您不确定,请说 N。

使用此选项可减少激进的 HPC 或实时工作负载的操作系统抖动。它还可以用于将 RCU 回调调用卸载到电池供电的非对称多处理器中的节能 CPU。

此选项从 rcu_nocbs 参数在启动时指定的一组 CPU 中卸载回调调用。对于每个这样的 CPU,将创建一个 kthread(“rcuox/N”)来调用回调,其中“N”是正在卸载的 CPU,“x”是 RCU-bh 的“b”,“p”用于 RCU 抢占,“s”用于 RCU 调度。没有什么可以阻止此 kthread 在指定的 CPU 上运行,但是 (1) kthread 可能会在每个回调之间被抢占,以及 (2) 亲和性或 cgroups 可用于强制 kthread 在任何需要的 CPU 集上运行。

如果您想帮助调试减少的操作系统抖动,请在此处说 Y。如果您不确定,请在此处说 N。

那你需要吗?

我想说的是,如果您在编译内核时不知道某个特定选项的作用,那么可以肯定的是,没有它您也能活下去。所以我会对这些问题说不。

此外,在进行此类工作时,我通常会获取与发行版一起使用的内核的配置文件,并进行比较以查看是否缺少任何功能。这可能是了解所有功能的最佳资源。

例如,在 Fedora 中,您可以参考包含的示例配置。有关更多详细信息,请查看此页面:构建自定义内核