Linux性能優化實戰學習筆記:第五十六講

1、上節回顧

上一節,我帶你一塊兒梳理了,性能問題分析的通常步驟。先帶你簡單回顧一下。算法

咱們能夠從系統資源瓶頸和應用程序瓶頸,這兩個角度來分析性能問題的根源。數據庫

從系統資源瓶頸的角度來講,USE 法是最爲有效的方法,即從使用率、飽和度以及錯誤數這三個方面,來分析 CPU、內存、磁盤和文件系統 I/O、網絡以及內核資源限制等各種軟硬件資源。至
於這些資源的分析方法,我也帶你一塊兒回顧了,我們專欄前面幾大模塊的分析套路。緩存

從應用程序瓶頸的角度來講,能夠把性能問題的來源,分爲資源瓶頸、依賴服務瓶頸以及應用自身的瓶頸這三類。性能優化

  1. 資源瓶頸的分析思路,跟系統資源瓶頸是同樣的。
  2. 依賴服務的瓶頸,可使用全鏈路跟蹤系統,進行快速定位。
  3. 而應用自身的問題,則能夠經過系統調用、熱點函數,或者應用自身的指標和日誌等,進行分析定位。

固然,雖然系統和應用是兩個不一樣的角度,但在實際運行時,它們每每相輔相成、相互影響。服務器

  1. 系統是應用的運行環境,系統瓶頸會致使應用的性能降低。
  2. 而應用程序不合理的設計,也會引起系統資源的瓶頸。

咱們作性能分析,就是要結合應用程序和操做系統的原理,揪出引起問題的「真兇「。網絡

找到性能問題的來源後,整個優化工做其實也就完成了一大半,由於這些瓶頸爲咱們指明瞭優化的方向。不過,對於性能優化來講,又有哪些常見的方法呢?數據結構

今天,我就帶你一塊兒來看看,性能優化的通常方法。同上一節的性能分析同樣,咱們也能夠從系統和應用程序,這兩個不一樣的角度來進行性能優化。多線程

2、系統優化

首先來看系統的優化。在上一節,我曾經介紹過,USE 法能夠用來分析系統軟硬件資源的瓶頸,那麼,相對應的優化方法,固然也是從這些資源瓶頸入手。架構

實際上,我們專欄的前四個模塊,除了最核心的系統資源瓶頸分析以外,也已經包含了這些常見資源瓶頸的優化方法。併發

接下來,我就從 CPU 性能、內存性能、磁盤和文件系統 I/O 性能以及網絡性能等四個方面,帶你回顧一下它們的優化方法。

3、CPU 優化

首先來看 CPU 性能的優化方法。在CPU 性能優化的幾個思路中,我曾經介紹過, CPU 性能優化的核心,在於排除全部沒必要要的工做、充分利用 CPU 緩存並減小進程調度對性能的影響。

從這幾個方面出發,我相信你已經想到了不少的優化方法。這裏,我主要強調一下,最典型的三種優化方法。

  1. 第一種,把進程綁定到一個或者多個 CPU 上,充分利用 CPU 緩存的本地性,並減小進程間的相互影響。
  2. 第二種,爲中斷處理程序開啓多 CPU 負載均衡,以便在發生大量中斷時,能夠充分利用多CPU 的優點分攤負載。
  3. 第三種,使用 Cgroups 等方法,爲進程設置資源限制,避免個別進程消耗過多的 CPU。同時,爲核心應用程序設置更高的優先級,減小低優先級任務的影響。

4、內存優化

說完了 CPU 的性能優化,咱們再來看看,怎麼優化內存的性能。在如何「快準狠」找到系統內存的問題中,我曾經爲你梳理了常見的一些內存問題,好比可用內存不足、內存泄漏、Swap 過
多、缺頁異常過多以及緩存過多等等。因此,說白了,內存性能的優化,也就是要解決這些內存使用的問題。

在我看來,你能夠經過如下幾種方法,來優化內存的性能。

  1. 第一種,除非有必要,Swap 應該禁止掉。這樣就能夠避免 Swap 的額外 I/O ,帶來內存訪問變慢的問題。
  2. 第二種,使用 Cgroups 等方法,爲進程設置內存限制。這樣就能夠避免個別進程消耗過多內存,而影響了其餘進程。對於核心應用,還應該下降 oom_score,避免被 OOM 殺死。
  3. 第三種,使用大頁、內存池等方法,減小內存的動態分配,從而減小缺頁異常。

5、磁盤和文件系統 I/O 優化

接下來,咱們再來看第三類系統資源,即磁盤和文件系統 I/O 的優化方法。在磁盤 I/O 性能優化的幾個思路 中,我已經爲你梳理了一些常見的優化思路,這其中有三種最典型的方法。

  1. 第一種,也是最簡單的方法,經過 SSD 替代 HDD、或者使用 RAID 等方法,提高 I/O 性能。
  2. 第二種,針對磁盤和應用程序 I/O 模式的特徵,選擇最適合的 I/O 調度算法。好比,SSD 和虛擬機中的磁盤,一般用的是 noop 調度算法;而數據庫應用,更推薦使用 deadline 算法。
  3. 第三,優化文件系統和磁盤的緩存、緩衝區,好比優化髒頁的刷新頻率、髒頁限額,以及內核回收目錄項緩存和索引節點緩存的傾向等等。

除此以外,使用不一樣磁盤隔離不一樣應用的數據、優化文件系統的配置選項、優化磁盤預讀、增大磁盤隊列長度等,也都是經常使用的優化思路。

6、網絡優化

最後一個是網絡的性能優化。在網絡性能優化的幾個思路中,我也已經爲你梳理了一些常見的優化思路。這些優化方法都是從 Linux 的網絡協議棧出發,針對每一個協議層的工做原理進行優化。
這裏,我一樣強調一下,最典型的幾種網絡優化方法。

首先,從內核資源和網絡協議的角度來講,咱們能夠對內核選項進行優化,好比:

  • 你能夠增大套接字緩衝區、鏈接跟蹤表、最大半鏈接數、最大文件描述符數、本地端口範圍等
  • 也能夠減小 TIMEOUT 超時時間、SYN+ACK 重傳數、Keepalive 探測時間等異常處理參數;
  • 還能夠開啓端口複用、反向地址校驗,並調整 MTU 大小等下降內核的負擔。

這些都是內核選項優化的最多見措施。

其次,從網絡接口的角度來講,咱們能夠考慮對網絡接口的功能進行優化,好比:

  • 你能夠將原來 CPU 上執行的工做,卸載到網卡中執行,即開啓網卡的 GRO、GSO、RSS、VXLAN 等卸載功能;
  • 也能夠開啓網絡接口的多隊列功能,這樣,每一個隊列就能夠用不一樣的中斷號,調度到不一樣 CPU上執行;
  • 還能夠增大網絡接口的緩衝區大小以及隊列長度等,提高網絡傳輸的吞吐量。

最後,在極限性能狀況(好比 C10M)下,內核的網絡協議棧多是最主要的性能瓶頸,因此,通常會考慮繞過內核協議棧。

  • 你可使用 DPDK 技術,跳過內核協議棧,直接由用戶態進程用輪詢的方式,來處理網絡請求。同時,再結合大頁、CPU 綁定、內存對齊、流水線併發等多種機制,優化網絡包的處理效率。
  • 你還可使用內核自帶的 XDP 技術,在網絡包進入內核協議棧前,就對其進行處理。這樣,也能夠達到目的,得到很好的性能。

7、應用程序優化

說完了系統軟硬件資源的優化,接下來,咱們再來看看應用程序的優化思路。

雖然系統的軟硬件資源,是保證應用程序正常運行的基礎,但你要知道, 性能優化的最佳位置,仍是應用程序內部。爲何這麼說呢?我簡單舉兩個例子你就明白了。

第一個例子,是系統 CPU 使用率(sys%)太高的問題。有時候出現問題,雖然表面現象是系統CPU 使用率太高,但待你分析事後,極可能會發現,應用程序的不合理系統調用纔是罪魁禍首。
這種狀況下,優化應用程序內部系統調用的邏輯,顯然要比優化內核要簡單也有用得多。

再好比說,數據庫的 CPU 使用率高、I/O 響應慢,也是最多見的一種性能問題。這種問題,通常來講,並非由於數據庫自己性能很差,而是應用程序不合理的表結構或者 SQL 查詢語句致使
的。這時候,優化應用程序中數據庫表結構的邏輯或者 SQL 語句,顯然要比優化數據庫自己,能帶來更大的收益。

因此,在觀察性能指標時,你應該先查看 應用程序的響應時間、吞吐量以及錯誤率等指標,由於它們纔是性能優化要解決的終極問題。以終爲始,從這些角度出發,你必定能想到不少優化方
法,而我比較推薦下面幾種方法。

  1. 第一,從 CPU 使用的角度來講,簡化代碼、優化算法、異步處理以及編譯器優化等,都是經常使用的下降 CPU 使用率的方法,這樣能夠利用有限的 CPU 處理更多的請求。
  2. 第二,從數據訪問的角度來講,使用緩存、寫時複製、增長 I/O 尺寸等,都是經常使用的減小磁盤I/O 的方法,這樣能夠得到更快的數據處理速度。
  3. 第三,從內存管理的角度來講,使用大頁、內存池等方法,能夠預先分配內存,減小內存的動態分配,從而更好地內存訪問性能。
  4. 第四,從網絡的角度來講,使用 I/O 多路複用、長鏈接代替短鏈接、DNS 緩存等方法,能夠優化網絡 I/O 並減小網絡請求數,從而減小網絡延時帶來的性能問題。
  5. 第五,從進程的工做模型來講,異步處理、多線程或多進程等,能夠充分利用每個 CPU 的處理能力,從而提升應用程序的吞吐能力。

除此以外,你還可使用消息隊列、CDN、負載均衡等各類方法,來優化應用程序的架構,將原來單機要承擔的任務,調度到多臺服務器中並行處理。這樣也每每能得到更好的總體性能。

8、小結

今天,我帶你一塊兒,從系統和應用程序這兩個角度,梳理了常見的性能優化方法。

從系統的角度來講,CPU、內存、磁盤和文件系統 I/O、網絡以及內核數據結構等各種軟硬件資源,爲應用程序提供了運行的環境,也是咱們性能優化的重點對象。你能夠參考我們專欄前面四
個模塊的優化篇,優化這些資源。

從應用程序的角度來講,下降 CPU 使用,減小數據訪問和網絡 I/O,使用緩存、異步處理以及多進程多線程等,都是經常使用的性能優化方法。除了這些單機優化方法,調整應用程序的架構,或是
利用水平擴展,將任務調度到多臺服務器中並行處理,也是經常使用的優化思路。

雖然性能優化的方法不少,不過,我仍是那句話,必定要避免過早優化。性能優化每每會提升複雜性,這一方面下降了可維護性,另外一方面也爲適應複雜多變的新需求帶來障礙。

因此,性能優化最好是逐步完善,動態進行;不追求一步到位,而要首先保證,能知足當前的性能要求。發現性能不知足要求或者出現性能瓶頸後,再根據性能分析的結果,選擇最重要的性能問題進行優化。

相關文章
相關標籤/搜索