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