CPU的隔離是什么?作用是什么?
時間:2023-09-11 來源:華清遠見
在正常的配置下,每個 CPU 都要承擔內務管理工作。相反,nohz_full 配置會以隱含方式移除 nohz_full 集合之外的所有的內務管理工作。
也就是說,如果有 8 個 CPU,并隔離 CPU 1、2、3、4、5、6、7:
nohz_full=1-7
則 CPU 0 將單獨處理內務管理工作。這些工作涉及:
未綁定計時器回調執行
未綁定工作隊列執行
未綁定 kthreads 執行
計時更新(jiffies 和 gettimeofday())
RCU 緩沖期跟蹤
代替隔離的 CPU 進行 RCU 回調執行
代替隔離的 CPU 執行 1Hz 殘余的已卸載計時器 Tick
根據擴展設置:
可以綁定的硬件 IRQ
除隔離的工作負載以外的用戶任務
盡管這些項目通常可由一個 CPU 代替其他 7 個 CPU 處理,但這種布局并不趨于無窮盡。隨著 CPU 數量的增加,同時,隨著內存和緩存的進一步分區,內務管理任務可能需要共擔。通常情況下,為每個 NUMA 節點配置一個管理 CPU 是一種不錯的方法。如以下配置所示:

由于 CPU 0 - 7 屬于節點 0,CPU 8 - 15 屬于節點 1,默認設置如下所示:
nohz_full=1-7,9-15
在測試階段,建議通過 top/htop 等工具檢查和監控管理程序的活動,以確保它們沒有超負荷。例如,如果以上設置顯示 CPU 0 或 CPU 8 的負荷為 100%,則可能需要添加更多的管理 CPU,盡管這種情況更有可能使用更多的節點來處理。
同樣需要注意的是,對內核的訪問(例如系統調用或內存故障)可能會產生更多的內務管理活動,并導致 CPU 承擔更多負載。通常不建議從隔離的 CPU 中請求內核服務,這一點我們將在下一章介紹。
在任何情況下,內核都有內務工作需要處理,這不能忽略。如果所有 CPU 都被傳遞到“nohz_full=” 內核參數,則 CPU 0 將從隔離集合內隨意清理出來,并為其單獨分配內務管理工作,使用的消息如下:
NO_HZ: Clearing 0 from nohz_full range for timekeeping
因此,要注意的是:被隔離的 CPU 之所以獲得無抖動的特性,是因為其他 CPU 承擔了更多工作,而至少一個 CPU 需要為這些工作做出犧牲。
然而,這種情況并非一成不變。從長遠來看,我們可以安排在隔離模式下運行所有 CPU,前提是在內核進入時更新計時,并且調度程序的能力進一步增強,能夠支持在用戶空間中運行長時間的任務,而不需要遠程中斷才能保持統計信息的最新狀態。但我們還沒有做到。
內核進入/退出的開銷
完全的 dynticks 模式增加了內核進入和退出的大量開銷。這些是由于:
系統調用
異常(頁面錯誤、陷阱等)
中斷
這些開銷首先是由于 RCU 跟蹤和排序造成的。這項工作通常由周期性計時器中斷來處理。現在,我們已經摒棄了這種方法,最終需要使用代價高昂的完全排序后的原子操作,來計算通過內核邊界的往返次數。
這些CPU的隔離是什么?作用是什么?
在正常的配置下,每個 CPU 都要承擔內務管理工作。相反,nohz_full 配置會以隱含方式移除 nohz_full 集合之外的所有的內務管理工作。
也就是說,如果有 8 個 CPU,并隔離 CPU 1、2、3、4、5、6、7:
nohz_full=1-7
則 CPU 0 將單獨處理內務管理工作。這些工作涉及:
未綁定計時器回調執行
未綁定工作隊列執行
未綁定 kthreads 執行
計時更新(jiffies 和 gettimeofday())
RCU 緩沖期跟蹤
代替隔離的 CPU 進行 RCU 回調執行
代替隔離的 CPU 執行 1Hz 殘余的已卸載計時器 Tick
根據擴展設置:
可以綁定的硬件 IRQ
除隔離的工作負載以外的用戶任務
盡管這些項目通常可由一個 CPU 代替其他 7 個 CPU 處理,但這種布局并不趨于無窮盡。隨著 CPU 數量的增加,同時,隨著內存和緩存的進一步分區,內務管理任務可能需要共擔。通常情況下,為每個 NUMA 節點配置一個管理 CPU 是一種不錯的方法。如以下配置所示:

由于 CPU 0 - 7 屬于節點 0,CPU 8 - 15 屬于節點 1,默認設置如下所示:
nohz_full=1-7,9-15
在測試階段,建議通過 top/htop 等工具檢查和監控管理程序的活動,以確保它們沒有超負荷。例如,如果以上設置顯示 CPU 0 或 CPU 8 的負荷為 100%,則可能需要添加更多的管理 CPU,盡管這種情況更有可能使用更多的節點來處理。
同樣需要注意的是,對內核的訪問(例如系統調用或內存故障)可能會產生更多的內務管理活動,并導致 CPU 承擔更多負載。通常不建議從隔離的 CPU 中請求內核服務,這一點我們將在下一章介紹。
在任何情況下,內核都有內務工作需要處理,這不能忽略。如果所有 CPU 都被傳遞到“nohz_full=” 內核參數,則 CPU 0 將從隔離集合內隨意清理出來,并為其單獨分配內務管理工作,使用的消息如下:
NO_HZ: Clearing 0 from nohz_full range for timekeeping
因此,要注意的是:被隔離的 CPU 之所以獲得無抖動的特性,是因為其他 CPU 承擔了更多工作,而至少一個 CPU 需要為這些工作做出犧牲。
然而,這種情況并非一成不變。從長遠來看,我們可以安排在隔離模式下運行所有 CPU,前提是在內核進入時更新計時,并且調度程序的能力進一步增強,能夠支持在用戶空間中運行長時間的任務,而不需要遠程中斷才能保持統計信息的最新狀態。但我們還沒有做到。
內核進入/退出的開銷
完全的 dynticks 模式增加了內核進入和退出的大量開銷。這些是由于:
系統調用
異常(頁面錯誤、陷阱等)
中斷
這些開銷首先是由于 RCU 跟蹤和排序造成的。這項工作通常由周期性計時器中斷來處理。現在,我們已經摒棄了這種方法,最終需要使用代價高昂的完全排序后的原子操作,來計算通過內核邊界的往返次數。
這些開銷的第二部分來自記錄CPU運行時間。同樣,內核必須使用內核邊界上的探測器來計算任務在內核和用戶空間中執行所花費的時間,因為周期性的中斷不再執行這項工作。盡管記錄 CPU 運行時間使用的排序比 RCU 跟蹤要弱,但仍有一些處理會增加總體開銷。
結語
CPU 隔離和 full dynticks 可以為某些特定工作負載帶來明顯好處,但需注意,它在許多情況下并不適用。您必須特別注意以下兩點:
所以需要犧牲一個隔離的 CPU,由其處理內核內部的無聊工作。
Full dynticks 僅適用于 CPU 計算型的工作負載,或者基于用戶空間驅動程序的 I/O。
的第二部分來自記錄CPU運行時間。同樣,內核必須使用內核邊界上的探測器來計算任務在內核和用戶空間中執行所花費的時間,因為周期性的中斷不再執行這項工作。盡管記錄 CPU 運行時間使用的排序比 RCU 跟蹤要弱,但仍有一些處理會增加總體開銷。
結語
CPU 隔離和 full dynticks 可以為某些特定工作負載帶來明顯好處,但需注意,它在許多情況下并不適用。您必須特別注意以下兩點:
所以需要犧牲一個隔離的 CPU,由其處理內核內部的無聊工作。
Full dynticks 僅適用于 CPU 計算型的工作負載,或者基于用戶空間驅動程序的 I/O。

