配置 Linux 内核时了解 RCU

配置 Linux 内核时了解 RCU

我正在配置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/?] 

答案1

有关这些选项的一些详细信息,请参见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 宽限期的持续时间,例如减慢 Synchronize_rcu() 的速度。

如果能源效率至关重要,并且您不关心宽限期的延长,请选择“是”。

如果您不确定,请选 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) 亲和力或 cgroup 可用于强制 kthread 在所需的任何 CPU 集上运行。

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

那么你需要它吗?

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

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

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

相关内容