避免在实时内核中出现 RCU Stalls
Issue
RCU (read-copy update,读复制更新)是一个内核同步机制。它通过启用对给定共享数据的读程序和写程序的并行访问来增加 Linux 系统的并行性。虽然 RCU 的读程序和写程序始终允许访问共享数据,但是写程序不允许在宽限期结束前释放已修改的、动态分配的数据。这个宽限期的限制可以确保没有写程序可以访问动态分配的共享数据的旧版本,在宽限期结束后允许写程序安全地将内存返回到系统。但是,这也为 RCU 造成了一个缺陷 - 长时间等待宽限期结束可能会导致系统内存不足。
为了警告宽限期结束所需的时间太长,系统会在内核日志中输出 RCU Stalls 的信息,通知等待宽限期结束的时间超过定义的超时时间。默认情况下,超时时间为 60 秒。
虽然 RCU Stall 也可能是因为内核 BUG 所造成的,但对于实时内核的用户,通常不是这种情况。在大多数情况下,实时用户会因为 RCU 回调执行延迟而出现 RCU stall。RCU 回调负责执行必要的 RCU 工作,以结束宽限期。
为了提供最佳的决策,实时内核被设置为在内核线程上执行所有 RCU 回调,允许用户根据自己的具体要求配置 RCU 回调线程的优先级。
备注: RCU 线程在其名称中带有 rcu
前缀。例如,rcu_preempt
和 rcuc/N
,其中 N
是允许在其中运行线程的 CPU。除 rcuc/N
线程之外,所有其他 RCU 线程都可以配置为在系统的任何 CPU 上运行。
实时内核所提供的这种灵活性也可能会导致出现非优化的设置,造成 RCU 回调不足,从而延缓了宽限期的结束。RCU 回调不足可能是直接的(RCU 线程本身无法运行),或者是间接的(因为 RCU 所依赖的线程无法运行造成 RCU 线程本身无法运行)。通常,造成 CPU 回调不足的原因是,一个具有高优先级的实时任务在同一 CPU 上运行超过了 60 秒,导致 RCU 回调无法在定义的超时时间内运行。
Environment
Red Hat Enterprise Linux for Real Time (RHEL-RT)
Red Hat Enterprise MRG (MRG-RT)
Subscriber exclusive content
A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.