主頁 > 軟體設計 > Linux性能優化之網路(五)

Linux性能優化之網路(五)

2021-10-22 07:36:05 軟體設計

文章目錄

    • 確定優化目標
    • 網路性能工具
    • 網路性能優化
      • 應用程式
      • 套接字
      • 傳輸層
      • 網路層
      • 鏈路層
    • 小結

確定優化目標

網路性能優化的目標是什么?換句話說,觀察到的網路性能指標,要達到多少才合適呢?

  • 實際上,雖然網路性能優化的整體目標,是降低網路延遲(如 RTT)和提高吞吐量(如 BPS 和 PPS),但具體到不同應用中,每個指標的優化標準可能會不同,優先級順序也大相徑庭,
    • NAT 網關通常需要達到或接近線性轉發,也就是說, PPS 是最主要的性能目標,
    • 再如,對于資料庫、快取等系統,快速完成網路收發,即低延遲,是主要的性能目標,
    • 對于我們經常訪問的 Web 服務來說,則需要同時兼顧吞吐量和延遲,
  • 所以,為了更客觀合理地評估優化效果,首先應該明確優化的標準,即要對系統和應用程式進行基準測驗,得到網路協議堆疊各層的基準性能,

Linux 網路協議堆疊,是我們需要掌握的核心原理,它是基于 TCP/IP 協議族的分層結構
在這里插入圖片描述

  • 在進行基準測驗時,可以按照協議堆疊的每一層來測驗,由于底層是其上方各層的基礎,底層性能也就決定了高層性能,
    • 首先是網路介面層網路層,它們主要負責網路包的封裝、尋址、路由,以及發送和接收,每秒可處理的網路包數 PPS,就是它們最重要的性能指標(特別是在小包的情況下),你可以用內核自帶的發包工具 pktgen ,來測驗 PPS 的性能,
    • 再向上到傳輸層的 TCP 和 UDP,它們主要負責網路傳輸,對它們而言,吞吐量(BPS)、連接數以及延遲,就是最重要的性能指標,你可以用 iperfnetperf ,來測驗傳輸層的性能,
    • 不過要注意,網路包的大小,會直接影響這些指標的值,所以,通常,你需要測驗一系列不同大小網路包的性能,
    • 最后,再往上到了應用層,最需要關注的是吞吐量(BPS)、每秒請求數以及延遲等指標,你可以用 wrkab 等工具,來測驗應用程式的性能,

網路性能工具

在這里插入圖片描述
在這里插入圖片描述

網路性能優化

  • 要優化網路性能,肯定離不開 Linux 系統的網路協議堆疊和網路收發流程的輔助,
    在這里插入圖片描述

應用程式

應用程式,通常通過套接字介面進行網路操作,由于網路收發通常比較耗時,所以應用程式的優化,主要就是對網路 I/O 和行程自身的作業模型的優化,

  • 網路 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 和行程的作業模型外,應用層的網路協議優化,也是至關重要的一點,常見的幾種優化方法,
    • 使用長連接取代短連接,可以顯著降低 TCP 建立連接的成本,在每秒請求次數較多時,這樣做的效果非常明顯,
    • 使用記憶體等方式,來快取不常變化的資料,可以降低網路 I/O 次數,同時加快應用程式的回應速度,
    • 使用 Protocol Buffer 等序列化的方式,壓縮網路 I/O 的資料量,可以提高應用程式的吞吐,
    • 使用 DNS 快取、預取、HTTPDNS 等方式,減少 DNS 決議的延遲,也可以提升網路 I/O 的整體速度,

套接字

  • 套接字可以屏蔽掉 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 ,可以分別調整套接字發送緩沖區和接識訓沖區的大小,

傳輸層

傳輸層最重要的是 TCP 和 UDP 協議,所以這兒的優化,其實主要就是對這兩種協議的優化,

TCP 協議的優化

  • TCP 提供了面向連接的可靠傳輸服務,要優化 TCP,我們首先要掌握 TCP 協議的基本原理,比如流量控制、慢啟動、擁塞避免、延遲確認以及狀態流圖(如下圖所示)等,
    在這里插入圖片描述
    在這里插入圖片描述

UDP的優化

  • UDP 提供了面向資料報的網路協議,它不需要網路連接,也不提供可靠性保障,所以,UDP 優化,相對于 TCP 來說,要簡單得多,這里總結了常見的幾種優化方案,
    • 跟套接字部分提到的一樣,增大套接字緩沖區大小以及 UDP 緩沖區范圍;
    • 跟 TCP 部分提到的一樣,增大本地埠號的范圍;
    • 根據 MTU 大小,調整 UDP 資料包的大小,減少或者避免分片的發生,

網路層

  • 網路層,負責網路包的封裝、尋址和路由,包括 IP、ICMP 等常見協議,在網路層,最主要的優化,其實就是對路由、 IP 分片以及 ICMP 等進行調優,
  • 第一種,從路由和轉發的角度出發,你可以調整下面的內核選項,
    • 在需要轉發的服務器中,比如用作 NAT 網關的服務器或者使用 Docker 容器時,開啟 IP 轉發,即設定 net.ipv4.ip_forward = 1,
    • 調整資料包的生存周期 TTL,比如設定 net.ipv4.ip_default_ttl = 64,注意,增大該值會降低系統性能,
    • 開啟資料包的反向地址校驗,比如設定 net.ipv4.conf.eth0.rp_filter = 1,這樣可以防止 IP 欺騙,并減少偽造 IP 帶來的 DDoS 問題,
  • 第二種,從分片的角度出發,最主要的是調整 MTU(Maximum Transmission Unit)的大小,
  • 第三種,從 ICMP 的角度出發,為了避免 ICMP 主機探測、ICMP Flood 等各種網路問題,你可以通過內核選項,來限制 ICMP 的行為,
    • 比如,你可以禁止 ICMP 協議,即設定 net.ipv4.icmp_echo_ignore_all = 1,這樣,外部主機就無法通過 ICMP 來探測主機,
    • 或者,你還可以禁止廣播 ICMP,即設定 net.ipv4.icmp_echo_ignore_broadcasts = 1,

鏈路層

  • 鏈路層負責網路包在物理網路中的傳輸,比如 MAC 尋址、錯誤偵測以及通過網卡傳輸網路幀等,自然,鏈路層的優化,也是圍繞這些基本功能進行的,接下來,從不同的幾個方面分別來看,
  • 由于網卡收包后呼叫的中斷處理程式(特別是軟中斷),需要消耗大量的 CPU,所以,將這些中斷處理程式調度到不同的 CPU 上執行,就可以顯著提高網路吞吐量,這通常可以采用下面兩種方法,
    • 可以為網卡硬中斷配置 CPU 親和性(smp_affinity),或者開啟 irqbalance 服務,
    • 可以開啟 RPS(Receive Packet Steering)和 RFS(Receive Flow Steering),將應用程式和軟中斷的處理,調度到相同 CPU 上,這樣就可以增加 CPU 快取命中率,減少網路延遲,
  • 另外,現在的網卡都有很豐富的功能,原來在內核中通過軟體處理的功能,可以卸載到網卡中,通過硬體來執行,
    • TSO(TCP Segmentation Offload)和 UFO(UDP Fragmentation Offload):在 TCP/UDP 協議中直接發送大包;而 TCP 包的分段(按照 MSS 分段)和 UDP 的分片(按照 MTU 分片)功能,由網卡來完成 ,
    • GSO(Generic Segmentation Offload):在網卡不支持 TSO/UFO 時,將 TCP/UDP 包的分段,延遲到進入網卡前再執行,這樣,不僅可以減少 CPU 的消耗,還可以在發生丟包時只重傳分段后的包,
    • LRO(Large Receive Offload):在接收 TCP 分段包時,由網卡將其組裝合并后,再交給上層網路處理,不過要注意,在需要 IP 轉發的情況下,不能開啟 LRO,因為如果多個包的頭部資訊不一致,LRO 合并會導致網路包的校驗錯誤,
    • GRO(Generic Receive Offload):GRO 修復了 LRO 的缺陷,并且更為通用,同時支持 TCP 和 UDP,
    • RSS(Receive Side Scaling):也稱為多佇列接收,它基于硬體的多個接收佇列,來分配網路接收行程,這樣可以讓多個 CPU 來處理接收到的網路包,
    • VXLAN 卸載:也就是讓網卡來完成 VXLAN 的組包功能,
  • 最后,對于網路介面本身,也有很多方法,可以優化網路的吞吐量,
    • 可以開啟網路介面的多佇列功能,這樣,每個佇列就可以用不同的中斷號,調度到不同 CPU 上執行,從而提升網路的吞吐量,
    • 可以增大網路介面的緩沖區大小,以及佇列長度等,提升網路傳輸的吞吐量(注意,這可能導致延遲增大),
    • 可以使用 Traffic Control 工具,為不同網路流量配置 QoS,

小結

  • 在優化網路的性能時,我們可以結合 Linux 系統的網路協議堆疊和網路收發流程,從應用程式、套接字、傳輸層、網路層再到鏈路層等,對每個層次進行逐層優化,
  • 實際上,我們分析和定位網路瓶頸,也是基于這些網路層進行的,而定位出網路性能瓶頸后,我們就可以根據瓶頸所在的協議層,進行優化,具體而言:
    • 在應用程式中,主要是優化 I/O 模型、作業模型以及應用層的網路協議;
    • 在套接字層中,主要是優化套接字的緩沖區大小;
    • 在傳輸層中,主要是優化 TCP 和 UDP 協議;
    • 在網路層中,主要是優化路由、轉發、分片以及 ICMP 協議;
    • 最后,在鏈路層中,主要是優化網路包的收發、網路功能卸載以及網卡選項,
  • 如果這些方法依然不能滿足你的要求,那就可以考慮,使用 DPDK 等用戶態方式,繞過內核協議堆疊;或者,使用 XDP,在網路包進入內核協議堆疊前進行處理,

你知道的越多,你不知道的越多,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330262.html

標籤:其他

上一篇:k8s部署express web應用(最新驗證,手把手教學)

下一篇:Web——面試題整理

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more