Kernel

在配置 Linux 核心時了解 RCU

  • June 20, 2013

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

在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 值允許您在小型(er)系統上測試大型系統程式碼路徑。

如果測試 RCU 本身,請選擇一個特定的數字。如果不確定,請使用預設值。

此選項強制使用指定的確切 RCU_FANOUT 值,而不管層次結構中的不平衡。這對於測試 RCU 本身很有用,並且有一天可能在具有強 NUMA 行為的系統上有用。

如果沒有 RCU_FANOUT_EXACT,程式碼將平衡層次結構。

如果不確定,請說 N。

此選項允許 CPU 進入 dynticks-idle 狀態,即使它們有 RCU 回調排隊,並防止 RCU 大約每四個 jiffies 喚醒這些 CPU 一次以上(預設情況下,您可以使用 rcutree.rcu_idle_gp_delay 參數進行調整),因此提高能源效率。另一方面,此選項會增加 RCU 寬限期的持續時間,例如減慢 synchronize_rcu()。

如果能源效率至關重要,並且您不關心增加的寬限期持續時間,請選擇 Y。

如果您不確定,請說 N。

使用此選項可減少激進 HPC 或實時工作負載的作業系統抖動。它還可用於將 RCU 回調呼叫解除安裝到電池供電的非對稱多處理器中的節能 CPU。

此選項從 rcu_nocbs 參數在引導時指定的 CPU 集中解除安裝回調呼叫。對於每個這樣的 CPU,將創建一個 kthread (“rcuox/N”) 來呼叫回調,其中“N”是正在解除安裝的 CPU,“x”是 RCU-bh 的“b”,“p”用於 RCU-preempt,“s”用於 RCU-sched。沒有什麼可以阻止這個 kthread 在指定的 CPU 上執行,但是 (1) kthread 可以在每個回調之間被搶占,以及 (2) 關聯或 cgroups 可以用來強制 kthread 在所需的任何 CPU 集上執行。

如果您想幫助調試減少的作業系統抖動,請在此處說 Y。如果您不確定,請在此處說 N。

那你需要嗎?

我會說,如果您在編譯核心時不知道某個特定選項的作用,那麼可以肯定地說,沒有它您也可以活下去。所以我會對這些問題說不。

此外,在進行此類工作時,我通常會獲取與發行版一起使用的核心的配置文件,並進行比較以查看是否缺少任何功能。這可能是您了解所有功能的最佳資源。

例如,在 Fedora 中,您可以參考其中包含的範例配置。查看此頁面了解更多詳細資訊:建構自定義核心

引用自:https://unix.stackexchange.com/questions/80063