我們知道為了 CPU 之間減少“干擾”,每個 CPU 上都有一個任務隊列。運行的過程種可能會出現(xiàn)有的 CPU 很忙,有的 CPU 很閑,如下圖所示:為了避免這個問題的出現(xiàn),Linux 內(nèi)核實現(xiàn)了 CPU 可運行進程隊列之間的負載均衡。因為負載均衡是在多個核上的均衡,所以在講解負載均衡之前,我們先看下多核的架構。將 task 從負載較重的 CPU 上轉(zhuǎn)移到負載相對較輕的 CPU 上執(zhí)行,這個過程就是負載均衡的過程。
多核架構
這里以 Arm64 的 NUMA(Non Uniform Memory Access) 架構為例,看下多核架構的組成。從圖中可以看出,這是非一致性內(nèi)存訪問。每個 CPU 訪問 local memory,速度更快,延遲更小。因為 Interconnect 模塊的存在,整體的內(nèi)存會構成一個內(nèi)存池,所以 CPU 也能訪問 remote memory,但是相對 local memory 來說速度更慢,延遲更大。我們知道一個多核心的 SOC 片上系統(tǒng),內(nèi)部結構是很復雜的。內(nèi)核采用 CPU 拓撲結構來描述一個 SOC 的架構,使用調(diào)度域和調(diào)度組來描述 CPU 之間的層次關系。
CPU 拓撲
每一個 CPU 都會維護這么一個結構體實例,用來描述 CPU 拓撲。struct?cpu_topology?{ ?int?thread_id; ?int?core_id; ?int?cluster_id; ?cpumask_t?thread_sibling; ?cpumask_t?core_sibling; };