Kernel configuration parameters for RCU
[Posted January 21, 2019 by jake]
This sidebar is part of Paul McKenney's 2019 update to the RCU API.
内核配置参数
RCU的Kconfig选项和内核引导参数可以被认为是RCU API的一部分。尤其是从一些为专用设备或工作负载构建内核的角度来看。
本节总结了与RCU相关的Kconfig选项和更常用的内核引导参数,但是请注意,许多Kconfig选项要求设置CONFIG RCU EXPERT Kconfig选项。
第一组Kconfig参数控制RCU实现本身的底层行为,并在内核/ RCU /Kconfig中定义。
CONFIG_PREEMPT = n和CONFIG_SMP = y意味着选择了CONFIG_TREE_RCU配置,因此选择非抢占式树型RCU的实现,比较适合SMP服务器级别的构建。
它可以容纳大量的cpu,但尺度足够但大多数内存受限系统。CONFIG_TREE_RCU提供了以下boot cmdline启动参数:
rcutree.blimit= 在一个批处理中,设置最大数目RCU回调,默认为10回调。这一限制并不适用于卸载cpu。
rcutree.qhimark= 设置阈值的排队RCU rcutree之外的回调。blimit =将被忽略。这个默认为10000回调。
rcutree.qlowmark= 设置阈值的排队RCU rcutree下面的回调。blimit =将再次生效。这个默认为100回调。
rcutree.jiffies_till_first_fqs= 设置jiffies的数量等之间的宽限期初始化和第一force-quiescent-state扫描检查对闲置的cpu(在其他事物之中)。
默认的值取决于赫兹和系统上的cpu数量。默认情况下,所有系统等待至少一个瞬间,有一个额外的瞬间赫兹大于250,赫兹大于500额外的瞬间,一个额外的瞬间为每个256 cpu系统。
这个值可能是手动设置为零,并将其用于专业系统往往有闲置的CPU,需要快速的宽限期,燃烧不介意一点额外的CPU在宽限期初始化。
CONFIG_PREEMPT = y意味着选择了CONFIG_PREEMPT_RCU配置,因此选择抢占的树型RCU实现适合实时和低延迟SMP构建。
它还可以容纳大量的cpu,和尺度足够但大多数内存受限系统。CONFIG_TREE_RCU配置的cmdline参数也适用于CONFIG_TREE_PREEMPT_RCU。
CONFIG_PREEMPT = n和CONFIG_SMP = n意味着选择了CONFIG_TINY_RCU配置,选择非抢占式单处理器()RCU实现,适合非实时构建。
它的实现是当前RCU子系统中占用内存最小的。
第二组Kconfig参数控制RCU的能效特性,他们定义在init/Kconfig中。
CONFIG_RCU_FAST_NO_HZ = y RCU的能源效率提高的次数减少RCU醒来空闲的cpu。 这种方法的缺点是,它增加RCU宽限期有所延迟。
rcutree.rcu_idle_gp_delay= 指定一个jffess数值,用于表示一个空闲cpu在下一次检查RCU state前,应该保持idle的时间。默认值是4个jiffies。
rcutree.rcu_idle_lazy_gp_delay= 指定一个jffess数值,适用于lazy回调。用于表示一个空闲cpu在下一次检查RCU state前,应该保持idle的时间。默认值是4个jiffies
(一个“lazy”回调是RCU什么都不做,除了释放内存)。默认值是6秒,或6 *赫兹jiffies
CONFIG_RCU_NOCB_CPU = y <<意外地改善RCU能源效率>>[PDF文档]通过消除唤醒由于RCU回调处理。然而,它是旨在实时使用,所以在下一节。
srcutree.exp_holdoff= 控制第一的auto-expediting SRCU宽限期后开始一段空闲时间,默认为25微秒。
如果它已经不再自去年SRCU宽限期结束(相同的srcu_struct结构),新SRCU宽限期将加快。请注意,这个内核启动参数的单位是纳秒。
请注意,这些特性不属于CONFIG_TINY_RCU,职位描述强调小内存占用的能源效率。
第三组Kconfig参数控制RCU的实时特性,也在init/Kconfig定义。
CONFIG_RCU_NOCB_CPU = y允许从选定的cpu卸载回调处理,“NOCB”代表“不回调”。可以指定cpu将在启动时,可以几个其他的事情:
rcu_nocbs= 可用于指定将在启动时的cpu。例如,rcu_nocbs=1-3,7会导致cpu 1,2,3,7他们回调被卸载到rcuo kthreads线程去执行。
卸载cpu的设置在运行时不能改变。然而,迄今为止的经验表明,当至少一个CPU需要卸载,卸载是很好。
因此,尚未有一个强烈的需要运行时更改的集合将cpu。当然,如果你有一个工作负载,需要卸载cpu的设置在运行时改变,请让我知道。
rcu_nocb_poll 也就减少了需要从卸载cpu执行唤醒操作。避免了rcuo kthreads线程显式的唤醒。另一方面
另一方面,这意味着所有的rcuo kthreads必须调查,这可能不是你想要的电池系统。(耗电)
rcutree.rcu_nocb_leader_stride= 设置的数量NOCB kthread团体,它默认的cpu数量的平方根。 大的数值可以减少唤醒per-cpu rcuc kthreads,
但是会增加同样的开销到每个group的leader。
CONFIG_NO_HZ_FULL 会使得RCU信任用户空间执行,作为一个扩展的静止状态,有点类似于RCU dyntick-idle cpu的处理。(类似于NO_HZ处理)
CONFIG_RCU_BOOST=y 使RCU优先级提高。 这可能被视为一个调试选项,但它是一个主要适用于实时内核,包括实时部分也是如此。
这个Kconfig参数会导致阻塞RCU读者priority-boosted为了避免无限期prolongment当前RCU宽限期。 以下Kconfig和引导参数控制提高过程:
CONFIG_RCU_BOOST_DELAY 指定RCU将允许一个宽限期多长时间被推迟开始前RCU优先级提高。默认值是300毫秒,在实践中似乎工作得很好。
rcutree.kthread_prio= 指定实时优先级提高,和默认优先级,最不重要的实时优先级。你应该设置这个优先级大于最高优先级线程实时中央处理器受限。
默认的优先级是适合普通情况下没有cpu线程运行在实时优先级。
第四组Kconfig参数也可以指定优化的数据结构布局CONFIG_TREE_RCU CONFIG_TREE_PREEMPT_RCU:
https://lwn.net/Articles/777214/
https://unix.stackexchange.com/questions/80063/understanding-rcu-when-configuring-the-linux-kernel
bing搜索CONFIG_RCU_EXPERT
https://www4.bing.com/search?q=CONFIG_RCU_EXPERT&qs=n&form=QBLHCN&sp=-1&pq=config_rcu_expert&sc=0-17&sk=&cvid=759C0E35E7174E678539E3FC8884CEB6