Linux性能優化實戰學習筆記:第四十三講

1、上節回顧

上一節,咱們瞭解了 NAT(網絡地址轉換)的原理,學會了如何排查 NAT 帶來的性能問題,最後還總結了 NAT 性能優化的基本思路。我先帶你簡單回顧一下。算法

NAT 基於 Linux 內核的鏈接跟蹤機制,實現了 IP 地址及端口號重寫的功能,主要被用來解決公網 IP 地址短缺的問題。數據庫

在分析 NAT 性能問題時,能夠先從內核鏈接跟蹤模塊 conntrack 角度來分析,好比用systemtap、perf、netstat 等工具,以及 proc 文件系統中的內核選項,來分析網絡協議
棧的行爲;而後,經過內核選項調優、切換到無狀態 NAT、使用 DPDK 等方式,進行實際優化。緩存

經過前面的學習,你應該已經體會到,網絡問題比咱們前面學過的 CPU、內存或磁盤 I/O都要複雜。不管是應用層的各類 I/O 模型,冗長的網絡協議棧和衆多的內核選項,抑或是
各類複雜的網絡環境,都提升了網絡的複雜性。性能優化

不過,也不要過度擔憂,只要你掌握了 Linux 網絡的基本原理和常見網絡協議的工做流程,再結合各個網絡層的性能指標來分析,你會發現,定位網絡瓶頸並不難。bash

找到網絡性能瓶頸後,下一步要作的就是優化了,也就是如何下降網絡延遲,並提升網絡的吞吐量。學完相關原理和案例後,我就來說講,優化網絡性能問題的思路和一些注意事項。網絡

因爲網絡優化思路的內容比較多,咱們分兩節來學習,今天咱們先來看上篇。負載均衡

2、肯定優化目標

跟 CPU 和 I/O 方面的性能優化同樣,優化前,我會先問問本身,網絡性能優化的目標是什麼?換句話說,咱們觀察到的網絡性能指標,要達到多少才合適呢?異步

實際上,雖然網絡性能優化的總體目標,是下降網絡延遲(如 RTT)和提升吞吐量(如BPS 和 PPS),但具體到不一樣應用中,每一個指標的優化標準可能會不一樣,優先級順序也截然不同。tcp

就拿上一節提到的 NAT 網關來講,因爲其直接影響整個數據中心的網絡出入性能,因此NAT 網關一般須要達到或接近線性轉發,也就是說, PPS 是最主要的性能目標。工具

再如,對於數據庫、緩存等系統,快速完成網絡收發,即低延遲,是主要的性能目標。而對於咱們常常訪問的 Web 服務來講,則須要同時兼顧吞吐量和延遲。

因此,爲了更客觀合理地評估優化效果,咱們首先應該明確優化的標準,即要對系統和應用程序進行基準測試,獲得網絡協議棧各層的基準性能。

在 怎麼評估系統的網絡性能 中,我已經介紹過,網絡性能測試的方法。簡單回顧一下,Linux 網絡協議棧,是咱們須要掌握的核心原理。它是基於 TCP/IP 協議族的分層結構,我
用一張圖來表示這個結構。

 

 

明白了這一點,在進行基準測試時,咱們就能夠按照協議棧的每一層來測試。因爲底層是其上方各層的基礎,底層性能也就決定了高層性能。因此咱們要清楚,底層性能指標,其
實就是對應高層的極限性能。咱們從下到上來理解這一點。

首先是網絡接口層和網絡層,它們主要負責網絡包的封裝、尋址、路由,以及發送和接收。每秒可處理的網絡包數 PPS,就是它們最重要的性能指標(特別是在小包的狀況
下)。你能夠用內核自帶的發包工具 pktgen ,來測試 PPS 的性能

再向上到傳輸層的 TCP 和 UDP,它們主要負責網絡傳輸。對它們而言,吞吐量(BPS)、鏈接數以及延遲,就是最重要的性能指標。你能夠用 iperf 或 netperf ,來測試傳輸層的性能。

不過要注意,網絡包的大小,會直接影響這些指標的值。因此,一般,你須要測試一系列不一樣大小網絡包的性能。

最後,再往上到了應用層,最須要關注的是吞吐量(BPS)、每秒請求數以及延遲等指標。你能夠用 wrk、ab 等工具,來測試應用程序的性能。

不過,這裏要注意的是,測試場景要儘可能模擬生產環境,這樣的測試才更有價值。好比,你能夠到生產環境中,錄製實際的請求狀況,再到測試中回放。

總之,根據這些基準指標,再結合已經觀察到的性能瓶頸,咱們就能夠明確性能優化的目標。

3、網絡性能工具

同前面學習同樣,我建議從指標和工具兩個不一樣維度出發,整理記憶網絡相關的性能工具。

第一個維度,從網絡性能指標出發,你更容易把性能工具同系統工做原理關聯起來,對性能問題有宏觀的認識和把握。這樣,當你想查看某個性能指標時,就能清楚知道,能夠用
哪些工具。

這裏,我把提供網絡性能指標的工具,作成了一個表格,方便你梳理關係和理解記憶。你能夠把它保存並打印出來,隨時查看。固然,你也能夠把它當成一個「指標工具」指南來使用。

再來看第二個維度,從性能工具出發。這可讓你更快上手使用工具,迅速找出想要觀察的性能指標。特別是在工具備限的狀況下,咱們更要充分利用好手頭的每個工具,用少
量工具也要盡力挖掘出大量信息。

一樣的,我也將這些經常使用工具,彙總成了一個表格,方便你區分和理解。天然,你也能夠當成一個「工具指標」指南使用,須要時查表便可。

4、網絡性能優化

總的來講,先要得到網絡基準測試報告,而後經過相關性能工具,定位出網絡性能瓶頸。再接下來的優化工做,就是水到渠成的事情了。

固然,仍是那句話,要優化網絡性能,確定離不開 Linux 系統的網絡協議棧和網絡收發流程的輔助。你能夠結合下面這張圖再回憶一下這部分的知識。

接下來,咱們就能夠從應用程序、套接字、傳輸層、網絡層以及鏈路層等幾個角度,分別來看網絡性能優化的基本思路

5、應用程序

應用程序,一般經過套接字接口進行網絡操做。因爲網絡收發一般比較耗時,因此應用程序的優化,主要就是對網絡 I/O 和進程自身的工做模型的優化。

相關內容,其實咱們在 C10K 和 C1000K 回顧 的文章中已經學過了。這裏咱們簡單回顧一下。

一、從網絡 I/O 的角度來講,主要有下面兩種優化思路。

第一種是最經常使用的 I/O 多路複用技術 epoll,主要用來取代 select 和 poll。這實際上是解決C10K 問題的關鍵,也是目前不少網絡應用默認使用的機制。

第二種是使用異步 I/O(Asynchronous I/O,AIO)。AIO 容許應用程序同時發起不少I/O 操做,而不用等待這些操做完成。等到 I/O 完成後,系統會用事件通知的方式,告訴
應用程序結果。不過,AIO 的使用比較複雜,你須要當心處理不少邊緣狀況。

二、而從進程的工做模型來講,也有兩種不一樣的模型用來優化。

第一種,主進程 + 多個 worker 子進程。其中,主進程負責管理網絡鏈接,而子進程負責實際的業務處理。這也是最經常使用的一種模型。

第二種,監聽到相同端口的多進程模型。在這種模型下,全部進程都會監聽相同接口,而且開啓 SO_REUSEPORT 選項,由內核負責,把請求負載均衡到這些監聽進程中去。
除了網絡 I/O 和進程的工做模型外,應用層的網絡協議優化,也是相當重要的一點。我總結了常見的幾種優化方法。

  1. 使用長鏈接取代短鏈接,能夠顯著下降 TCP 創建鏈接的成本。在每秒請求次數較多時,這樣作的效果很是明顯。
  2. 使用內存等方式,來緩存不常變化的數據,能夠下降網絡 I/O 次數,同時加快應用程序的響應速度。
  3. 使用 Protocol Buffer 等序列化的方式,壓縮網絡 I/O 的數據量,能夠提升應用程序的吞吐。
  4. 使用 DNS 緩存、預取、HTTPDNS 等方式,減小 DNS 解析的延遲,也能夠提高網絡I/O 的總體速度。

6、套接字

套接字能夠屏蔽掉 Linux 內核中不一樣協議的差別,爲應用程序提供統一的訪問接口。每一個套接字,都有一個讀寫緩衝區。

  • 讀緩衝區,緩存了遠端發過來的數據。若是讀緩衝區已滿,就不能再接收新的數據。
  • 寫緩衝區,緩存了要發出去的數據。若是寫緩衝區已滿,應用程序的寫操做就會被阻塞。

因此,爲了提升網絡的吞吐量,你一般須要調整這些緩衝區的大小。好比:

增大每一個套接字的緩衝區大小 net.core.optmem_max;
增大套接字接收緩衝區大小 net.core.rmem_max 和發送緩衝區大小net.core.wmem_max;
增大 TCP 接收緩衝區大小 net.ipv4.tcp_rmem 和發送緩衝區大小net.ipv4.tcp_wmem。

至於套接字的內核選項,我把它們整理成了一個表格,方便你在須要時參考:

不過有幾點須要你注意。

  • tcp_rmem 和 tcp_wmem 的三個數值分別是 min,default,max,系統會根據這些設置,自動調整 TCP 接收 / 發送緩衝區的大小。
  • udp_mem 的三個數值分別是 min,pressure,max,系統會根據這些設置,自動調整UDP 發送緩衝區的大小。

固然,表格中的數值只提供參考價值,具體應該設置多少,還須要你根據實際的網絡情況來肯定。好比,發送緩衝區大小,理想數值是吞吐量 * 延遲,這樣才能夠達到最大網絡利用率。

除此以外,套接字接口還提供了一些配置選項,用來修改網絡鏈接的行爲。

  • 爲 TCP 鏈接設置 TCP_NODELAY 後,就能夠禁用 Nagle 算法;
  • 爲 TCP 鏈接開啓 TCP_CORK 後,可讓小包聚合成大包後再發送(注意會阻塞小包的發送);
  • 使用 SO_SNDBUF 和 SO_RCVBUF ,能夠分別調整套接字發送緩衝區和接收緩衝區的大小。

7、小結

今天,咱們一塊兒梳理了常見的 Linux 網絡性能優化方法

在優化網絡性能時,你能夠結合 Linux 系統的網絡協議棧和網絡收發流程,而後從應用程序、套接字、傳輸層、網絡層再到鏈路層等,進行逐層優化。

固然,其實咱們分析、定位網絡瓶頸,也是基於這些進行的。定位出性能瓶頸後,就能夠根據瓶頸所在的協議層進行優化。好比,今天咱們學了應用程序和套接字的優化思路:

在應用程序中,主要優化 I/O 模型、工做模型以及應用層的網絡協議;
在套接字層中,主要優化套接字的緩衝區大小。

而其餘各個網絡層的優化方法,建議你先本身想想,下一節,咱們再來一塊兒總結。

相關文章
相關標籤/搜索