系統性能優化-8 TCP緩沖區與擁塞控制

每個 TCP 連接都有發送緩沖區和接收緩沖區,發送緩沖區存已發送未確認數據和待發送數據,接收緩沖區存接收但是沒有被上層服務讀取的數據。

# cat /proc/net/sockstat
sockets: used 1885
TCP: inuse 537 orphan 0 tw 3 alloc 959 mem 10其中 mem 代表當前 TCP 連接占用的頁面數

image-20250627153818521

# 擴大窗口協議,之前只有 16 位,最多標識 0-65535 字節,開啟后最大可到 1GB(2^30)
sysctl net.ipv4.tcp_window_scaling
# 單個TCP連接的寫緩沖區 分別代表 最小值,默認值,最大值,單位 Byte
# sysctl net.ipv4.tcp_wmem
net.ipv4.tcp_wmem = 4096        16384   4194304
# 單個TCP連接的讀緩沖區 分別代表 最小值,默認值,最大值,單位 Byte
# sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096        87380   6291456

發送緩沖區的調節功能是自動開啟的,而接收緩沖區則需要配置 tcp_moderate_rcvbuf 為 1 來開啟調節功能

# 接收緩沖區自動調解功能
# sysctl net.ipv4.tcp_moderate_rcvbuf
net.ipv4.tcp_moderate_rcvbuf = 1
# Linux 對 TCP接收緩沖區的調解控制 分別代表 最小值,默認值,最大值 單位是頁(page)
# sysctl net.ipv4.tcp_mem
net.ipv4.tcp_mem = 3087300      4116401  6174600# 獲取頁面大小 單位 Byte
# getconf PAGESIZE
4096

tcp_mem 是 Linux 判斷系統內存是否緊張的依據,當 TCP 內存小于第 1 個值時,不需要進行自動調節;在第 1 和第 2 個值之間時,內核開始調節接收緩沖區的大小;大于第 3 個值時,內核不再為 TCP 分配新內存,此時新連接是無法建立的。

在高并發服務器中,為了兼顧網速與大量的并發連接,我們應當保證緩沖區的動態調整上限達到帶寬時延積,而下限保持默認的 4K 不變即可。而對于內存緊張的服務而言,調低默認值是提高并發的有效手段。

同時,如果這是網絡 IO 型服務器,那么,**調大 tcp_mem 的上限可以讓 TCP 連接使用更多的系統內存,這有利于提升并發能力。**需要注意的是,tcp_wmem 和 tcp_rmem 的單位是字節,而 tcp_mem 的單位是頁面大小。而且,千萬不要在 socket 上直接設置 SO_SNDBUF (寫緩沖區上限)或者 SO_RCVBUF(讀緩沖區上限),這樣會關閉緩沖區的動態調整功能。

在擁塞控制中,首先會進行慢開始(每收到1個 ACK 窗口就+1,相當于1個 RTT 翻一倍),慢開始指初始窗口比較小,而不是增長的慢,增長是指數級的,其實很快。這就涉及到初始擁塞窗口的大小:

# 查看當前連接的初始擁塞窗口
ss -nli | fgrep cwnd
# 修改初始擁塞窗口 10 MSS,如果網絡特別好可以繼續加大,有些高速 CDN 站點,甚至把初始擁塞窗口提升到 70 個 MSS
ip route | while read r; doip route change $r initcwnd 10;done

初始擁塞窗口越大,小請求就可以更快發送完畢,也會更快的結束慢開始,結束慢開始的情況一般有以下三類:

  • 定時器超時,觸發重傳
  • 擁塞窗口的增長到達了慢啟動閾值 ssthresh(全稱為 slow start threshold)
  • 接收到重復的 ACK 報文,可能存在丟包

在第一種情況下,說明網絡擁塞已經比較嚴重了,不同的算法會有不同的調整,目前主流的調整算法 CUBIC 算法會把擁塞窗口降為原先的 0.8 倍

# 查看當前系統支持的擁塞調整算法
sysctl net.ipv4.tcp_available_congestion_control
# 配置具體的擁塞調整算法
net.ipv4.tcp_congestion_control = cubic

這種算法在內網中效率高于 BBR,因為內網本來就時延低,但在高 RT 場景下表現不如 BBR,BBR 基于測量實現擁塞窗口的動態調整,在丟包率較高的網絡中應用效果尤其好,例如此時網絡帶寬不變,但是請求時延增加,說明網絡已經開始阻塞了,CUBIC 直到丟包才開始控制,是有些滯后了的。Linux 4.9 版本之后都支持 BBR 算法,同樣使用 tcp_congestion_control 進行配置。

在第二種情況下,已經到了慢啟動閾值,可能接下來就會出現擁塞,因此擁塞窗口不再指數級增長,而是線性增長

在第三種情況下,對方連續發送重復 ACK(例如3個) 說明網絡情況尚可,可能由于中間設備等原因造成某包丟失或失序,不應認為網絡出現嚴重擁塞,因此觸發快速重傳,略微降低發送速度,這里有個問題其實是,比如報文 6 7 8 一起發送,對方發了 3 個連續的 6 的 ACK,觸發報文 6 的重傳時,是否要發 7 和 8,如果發可能對方已經收到了只是 6 一直沒到,就浪費帶寬了,如果不發也可能網絡不好丟失了,待會還要重發,SACK (Selective Acknowledgment)選擇性確認機制解決了這個問題,接收方通過 TCP 頭部選項字段精準反饋已接收的非連續數據段信息,使發送方僅重傳真正丟失的報文段。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87048.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87048.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【前端】vue工程環境配置

環境準備(Windows版本) nodejs安裝 (base) PS C:\Users\Administrator> nvm install 18.8.0 (base) PS C:\Users\Administrator> nvm use 18.8.0 Now using node v18.8.0 (64-bit) (base) PS C:\Users\Administrator> npm -v 8.18.0 (base) PS C:\Users\Administrat…

什么是data version control?為什么需要它?它能解決什么問題?

Data Version Control (DVC) 是一個開源工具,專為數據科學和機器學習項目設計。它的核心目標是像 Git 管理代碼一樣來管理機器學習項目中的數據和模型文件。 簡單來說,DVC 是什么? Git for Data & Models: 它擴展了 Git 的功…

簡約計生用品商城簡介

計生用品商城簡介:uniapp結合thinkphp實現的全開源代碼, 內置基本功能:1.后臺商品excel一鍵導入 2.分銷利潤,按照利潤加個分紅

go中自動補全插件安裝-gopls

vscode中安裝gopls失敗,導致go中代碼無提示,無法自動補全引用 環境變量中設置go的代理:setx GOPROXY “https://goproxy.cn,direct”go install golang.org/x/tools/goplslatest

力扣尋找數組中心索引-性能優化思考

如下代碼 var pivotIndex function(nums) {// 空數組返回-1if (nums.length 0) return -1// 計算數組總和const totalSum nums.reduce((sum, num) > sum num, 0);let leftSum 0;// 遍歷數組查找中心索引for (let i 0; i < nums.length; i) {// 右側和 總和 - 左側…

SVN 分支管理(本文以Unity項目為例)

文章目錄 1.準備工作2.新建SVN倉庫2.拉取遠端空 trunk 到Unity項目目錄下3.設置忽略&#xff0c;提交unity項目至倉庫3.創建分支4.切換分支5.合并分支回主干&#xff08;例如將 trunk_01 合并回 trunk&#xff09;5.刪除分支&#xff08;可選&#xff09; 1.準備工作 下載Tort…

數據結構學習day6---流+讀寫函數+緩沖+定義函數

目錄 1.標準io&#xff1b; stdio.h 1.1標準io的概念 1.2Linux操作系統當中IO都是對文件的操作 1.3標準IO&#xff1a;ANSI C 設計的一組用文件IO 封裝的操作庫函數 2.文件 2.1作用 2.2linux中文件的類型 3.man 5.流: FILE* 5.1流的定義 5.2流的分類 6.c語言文…

互聯網醫院,正在發生的醫療新變革

隨著信息技術的飛速發展&#xff0c;互聯網醫院作為醫療服務的新形態&#xff0c;正在全球范圍內迅速崛起。在中國&#xff0c;這一變革尤為顯著&#xff0c;互聯網醫院不僅改善了醫療服務的可及性和便捷性&#xff0c;還極大地提升了醫療服務的質量和效率。 一、互聯網醫院的發…

rabbitmq動態創建交換機、隊列、動態綁定,銷毀

// 緩存已創建的綁定&#xff0c;避免重復聲明private final Map<String, Date> createdBindings new ConcurrentHashMap<>(); public void createAndBindQueueToExchange(String type,String clinetId, String routingKey) {String queueName routingKey;lo…

云效代碼倉庫導入自建gitlab中

登錄自建GitLab 在瀏覽器中輸入GitLab訪問地址http://192.168.1.111:81/users/sign_in&#xff0c;輸入賬號和密碼登錄GitLab服務&#xff0c;如下圖&#xff1a; 新建一個空的代碼庫 按照以下截圖順序&#xff0c;創建一個新的空項目&#xff0c;如下&#xff1a; 克隆鏡像 …

業界優秀的零信任安全管理系統產品介紹

騰訊 iOA 零信任安全管理系統 簡介&#xff1a;騰訊 iOA 零信任安全管理系統是騰訊終端安全團隊針對企業安全上云和數字化轉型&#xff0c;提供的企業網絡邊界處的應用訪問管控系統&#xff0c;為企業應用提供統一、安全、高效的訪問入口&#xff0c;同時提供終端安全加固、軟…

從設計到開發一個小程序頁面

巧婦難為無米之炊&#xff0c;想寫功能但是沒有好看的設計&#xff0c;邊寫邊設計效率又不夠高。mastergoAi生成的頁面又不夠好看&#xff0c;而且每月給的免費積分用得又超快&#xff0c;so決定自給自足。能有多難&#xff0c;先做&#xff0c;做了再改。 于是決定踏足設計&a…

Linux系統 / Ubuntu虛擬機 安裝DHCP服務

一、安裝DHCP服務 xxx:~$ sudo apt install isc-dhcp-server 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 將會同時安裝下列軟件&#xff1a; libirs-export161 libisccfg-export163 建議安裝&#xff1a; isc-dhcp-s…

Spring中 BeanFactory和FactoryBean分別是什么?

Spring 中 BeanFactory 是什么? BeanFactory其實就是IoC的底層容器&#xff0c;它本身只是一個接口&#xff0c;顧名思義Bean工廠&#xff0c;定義了Spring的基本功能框架&#xff0c;主要功能就是 負責從配置源中讀取 Bean 的定義&#xff0c;并創建、管理這些 Bean 的生命周…

langchain從入門到精通(三十二)——RAG優化策略(八)自查詢檢索器實現動態數據過濾

1. 查詢構建與自查詢檢索器 在 RAG 應用開發中&#xff0c;檢索外部數據時&#xff0c;前面的優化案例中&#xff0c;無論是生成的 子查詢、問題分解、生成假設性文檔&#xff0c;最后在執行檢索的時候使用的都是固定的篩選條件&#xff08;沒有附加過濾的相似性搜索&#xff…

面向安全產品測試的靜態混淆型 Shellcode Loader 設計與對抗分析

github 地址&#xff1a;https://github.com/LilDean17/ShellcodeLoader2025 一、項目背景 近年來&#xff0c;隨著 C2 框架廣泛應用于安全對抗模擬&#xff0c;各大安全廠商也不斷提升其檢測能力&#xff0c;那么安全廠商自研的安全軟件&#xff0c;是否能有效防御此類威脅&…

深度強化學習DRL——策略學習

一、策略網絡 策略函數 π \pi π的輸入是狀態 s s s和動作 a a a&#xff0c;輸出是一個介于0和1之間的概率值&#xff0c;用神經網絡 π ( a ∣ s ; θ ) \pi(a \mid s; \boldsymbol{\theta}) π(a∣s;θ)近似策略函數 π ( a ∣ s ) \pi(a\mid s) π(a∣s)&#xff0c; θ …

ISP Pipeline(5): Auto White Balance Gain Control (AWB) 自動白平衡

G_gain 1.0 # 常作為參考通道 R_gain G_avg / R_avg B_gain G_avg / B_avgAuto White Balance Gain Control&#xff08;AWB&#xff09;自動調整圖像中紅色、綠色、藍色通道的增益&#xff0c;使圖像中灰白區域的顏色看起來為“中性白”或“灰白”&#xff0c;從而矯正因光…

Python中鉤子函數的實現方式

在Python中&#xff0c;鉤子函數(Hook)是一種允許你在程序執行的特定點插入自定義代碼的技術。它本質上是一種回調機制&#xff0c;當特定事件發生時自動調用預先注冊的函數。 Python中鉤子函數的實現方式 Python中實現鉤子主要有以下幾種方式&#xff1a; ?回調函數?&…

【RTSP從零實踐】3、實現最簡單的傳輸H264的RTSP服務器

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…