服務器中最重要的組件就是CPU,所以關于CPU的優化至關重要,接下來我們從應用程序和系統的角度,分別來看看如何才能降低 CPU 使用率,提高 CPU 的并行處理能力。
一、應用程序優化
首先,從應用程序的角度來說,降低 CPU 使用率的最好方法當然是,排除所有不必要的工作,只保留最核心的邏輯。比如減少循環的層次、減少遞歸、減少動態內存分配等等。除此之外,應用程序的性能優化也包括很多種方法,我在這里列出了最常見的幾種,你可以記下來。
1.編譯器優化:很多編譯器都會提供優化選項,適當開啟它們,在編譯階段你就可以獲得編譯器的幫助,來提升性能。比如, gcc 就提供了優化選項 -O2,開啟后會自動對應用程序的代碼進行優化。
2.算法優化:使用復雜度更低的算法,可以顯著加快處理速度。比如,在數據比較大的情況下,可以用 O(nlogn) 的排序算法(如快排、歸并排序等),代替 O(n^2) 的排序算法(如冒泡、插入排序等)。
3.異步處理:使用異步處理,可以避免程序因為等待某個資源而一直阻塞,從而提升程序的并發處理能力。比如,把輪詢替換為事件通知,就可以避免輪詢耗費 CPU 的問題。
4.多線程代替多進程:前面講過,相對于進程的上下文切換,線程的上下文切換并不切換進程地址空間,因此可以降低上下文切換的成本。
5.善用緩存:經常訪問的數據或者計算過程中的步驟,可以放到內存中緩存起來,這樣在下次用時就能直接從內存中獲取,加快程序的處理速度。
二、系統優化
從系統的角度來說,優化 CPU 的運行,一方面要充分利用 CPU 緩存的本地性,加速緩存訪問;另一方面,就是要控制進程的 CPU 使用情況,減少進程間的相互影響。具體來說,系統層面的 CPU 優化方法也有不少,這里我同樣列舉了最常見的一些方法,方便你記憶和使用。
1.CPU 綁定:把進程綁定到一個或者多個 CPU 上,可以提高 CPU 緩存的命中率,減少跨 CPU 調度帶來的上下文切換問題。- - CPU 獨占:跟 CPU 綁定類似,進一步將 CPU 分組,并通過 CPU 親和性機制為其分配進程。這樣,這些 CPU 就由指定的進程獨占,換句話說,不允許其他進程再來使用這些 CPU。
2.優先級調整:使用 nice 調整進程的優先級,正值調低優先級,負值調高優先級。優先級的數值含義前面我們提到過,忘了的話及時復習一下。在這里,適當降低非核心應用的優先級,增高核心應用的優先級,可以確保核心應用得到優先處理。
3.為進程設置資源限制:使用 Linux cgroups 來設置進程的 CPU 使用上限,可以防止由于某個應用自身的問題,而耗盡系統資源。
NUMA(Non-Uniform Memory Access)優化:支持 NUMA 的處理器會被劃分為多個 node,每個 node 都有自己的本地內存空間。NUMA 優化,其實就是讓 CPU 盡可能只訪問本地內存。
4.中斷負載均衡:無論是軟中斷還是硬中斷,它們的中斷處理程序都可能會耗費大量的 CPU。開啟 irqbalance 服務或者配置 smp_affinity,就可以把中斷處理過程自動負載均衡到多個 CPU 上。
以上,就是關于服務器CPU優化的建議。