【網絡】Linux 內核優化實戰 - net.ipv4.tcp_mem

目錄

      • 參數結構與含義
      • 與緩沖區大小參數的區別
      • 內存管理機制詳解
        • 1. 內存使用狀態與觸發邏輯
        • 2. 與其他參數的協同關系
      • 典型調整場景與配置示例
        • 場景 1:高并發低帶寬服務(如 API 網關,數萬連接但單連接流量小)
        • 場景 2:高帶寬低并發服務(如文件服務器,少量連接但流量大)
        • 場景 3:防止突發流量導致 OOM
      • 驗證與監控方法
      • 注意事項與常見誤區
      • 總結

net.ipv4.tcp_mem 是 Linux 內核中控制 TCP 內存分配和管理的重要參數,主要用于調節 TCP 套接字緩沖區的內存使用策略。它通過三個關鍵值來管理系統范圍內 TCP 連接的內存消耗,與 net.ipv4.tcp_rmemnet.core.rmem_default 等緩沖區大小參數不同, tcp_mem 更側重于 系統整體內存資源的分配策略。以下是詳細解析:

參數結構與含義

net.ipv4.tcp_mem 是一個三元組,格式為 low medium high,例如常見默認值 4194304 5592408 8388612(單位為頁,每頁通常為 4KB)。三個值的具體作用如下:

參數值含義觸發行為
lowTCP 內存使用的下限閾值。當系統中 TCP 套接字占用的內存總量低于此值時,內存管理處于正常狀態,無特殊操作。
medium中等閾值,介于下限和上限之間。當內存使用超過 low 但未達 high 時,內核會開始觸發內存回收機制,嘗試釋放部分 TCP 緩沖區內存。
highTCP 內存使用的上限閾值。當內存使用超過此值時,內核會采取更激進的措施(如限制新連接建立、丟棄數據包),以防止系統內存耗盡。

與緩沖區大小參數的區別

參數類型net.ipv4.tcp_memnet.ipv4.tcp_rmem / net.core.rmem_default
控制維度系統全局 TCP 內存總量策略單個套接字的接收/發送緩沖區大小
作用對象所有 TCP 連接的內存總和單個 TCP 連接的接收/發送緩沖區
核心功能防止 TCP 內存占用過高導致系統 OOM優化單個連接的網絡性能(吞吐量、延遲等)
參數格式三元組(low, medium, high)三元組(tcp_rmem)或單個值(rmem_default)
典型調整場景高并發連接場景(如 Web 服務器)防止內存耗盡高帶寬場景(如 CDN、文件傳輸)優化吞吐量

內存管理機制詳解

1. 內存使用狀態與觸發邏輯
  • 正常狀態(< low)
    所有 TCP 連接可自由分配內存,內核不干預緩沖區大小。

  • 警告狀態(low ≤ 使用量 < medium)
    內核啟動 TCP 內存回收機制,通過以下方式釋放內存:

    • 減少空閑連接的緩沖區大小;
    • 加速 ACK 確認以釋放已接收數據的內存;
    • 對低優先級連接的緩沖區進行壓縮。
  • 臨界狀態(≥ high)
    內核采取強制限流措施

    • 限制新 TCP 連接的建立(tcp_syncookies 可能被觸發);
    • 對入站數據包進行丟棄(優先丟棄未被確認的數據包);
    • 對部分連接的發送緩沖區進行強制收縮,降低發送速率。
2. 與其他參數的協同關系
  • tcp_rmem/tcp_wmem 的關系
    tcp_mem 不直接限制單個連接的緩沖區大小,但會影響全局內存分配策略。例如:

    • tcp_rmemmax 設置過大,可能導致大量連接同時占用高內存,觸發 tcp_memhigh 閾值。
    • 調整 tcp_mem 可平衡“高并發連接數”與“單個連接緩沖區大小”的內存矛盾。
  • vm.overcommit_memory 的關系
    系統內存整體管理策略(如是否允許超額分配)會影響 tcp_mem 的效果。例如:

    • vm.overcommit_memory = 2(嚴格模式)時,tcp_mem 的限流會更激進。

典型調整場景與配置示例

場景 1:高并發低帶寬服務(如 API 網關,數萬連接但單連接流量小)
  • 問題:大量連接占用內存,可能觸發 high 閾值。
  • 配置
    net.ipv4.tcp_mem = 1048576 1572864 2097152  # 1MB-1.5MB-2MB(假設每頁 4KB,即 256-384-512 頁)
    net.ipv4.tcp_rmem = 4096 87380 262144        # 縮小單個連接的默認緩沖區
    
  • 原理:降低單個連接內存占用,同時調整 tcp_mem 閾值,避免高并發連接耗盡內存。
場景 2:高帶寬低并發服務(如文件服務器,少量連接但流量大)
  • 問題:單個連接緩沖區過大,可能觸發 high 閾值。
  • 配置
    net.ipv4.tcp_mem = 8388608 12582912 16777216  # 8MB-12MB-16MB(2048-3072-4096 頁)
    net.ipv4.tcp_rmem = 4096 1048576 16777216     # 增大單個連接緩沖區
    
  • 原理:允許單個連接使用更大緩沖區,同時提高 tcp_mem 閾值以容納高帶寬流量的內存需求。
場景 3:防止突發流量導致 OOM
  • 配置
    net.ipv4.tcp_mem = 33554432 44739243 55924054  # 32MB-43MB-54MB(假設系統內存 16GB)
    net.ipv4.tcp_max_orphans = 32768               # 配合限制孤兒連接數
    
  • 原理:通過 tcp_mem 提前觸發內存回收,結合 tcp_max_orphans 限制無效連接占用內存。

驗證與監控方法

  1. 查看當前配置

    cat /proc/sys/net/ipv4/tcp_mem
    # 輸出示例:4194304 5592408 8388612(分別對應 low, medium, high)
    
  2. 監控 TCP 內存使用

    # 方法 1:通過 /proc/net/snmp 查看
    cat /proc/net/snmp | grep Tcp | grep InSegs  # 結合流量判斷內存壓力# 方法 2:使用 ss 命令查看全局內存統計
    ss -s | grep memory   # 查看 TCP 內存占用總量# 方法 3:監控系統日志
    dmesg | grep -i tcp   # 若觸發內存限制,會有相關日志(如 "TCP: dropping packet")
    
  3. 壓力測試驗證
    使用 hping3netperf 模擬高并發/高帶寬流量,觀察系統是否因 tcp_mem 觸發限流。

注意事項與常見誤區

  1. 內存單位混淆
    tcp_mem 的單位是(通常 4KB/頁),而 tcp_rmem 等參數單位是字節,調整時需注意換算(如 1 頁 = 4KB1024 頁 = 4MB)。

  2. 忽略系統整體內存
    tcp_mem 的閾值應根據系統物理內存調整,例如:

    • 8GB 內存服務器:low 可設為 2097152(512 頁,2MB);
    • 64GB 內存服務器:low 可設為 8388608(2048 頁,8MB)。
  3. 單獨調整 tcp_mem 的局限性
    若系統頻繁觸發 high 閾值,需同時檢查:

    • 是否有惡意流量(DDoS 攻擊);
    • tcp_max_orphans(孤兒連接數限制)是否合理;
    • vm.swappiness(swap 使用策略)是否影響內存回收效率。

總結

net.ipv4.tcp_mem 是 Linux 內核中 TCP 內存管理的“全局開關”,通過設置低、中、高閾值來控制內存分配策略,防止 TCP 連接耗盡系統資源。在優化時,需結合業務場景(高并發/高帶寬)、系統內存大小,與 tcp_rmemtcp_wmem 等緩沖區參數協同調整,以平衡性能與穩定性。

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

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

相關文章

插入排序的簡單介紹

今天給大家簡單介紹一下插入排序。 插入排序&#xff0c;其基本思想是將未排序的數據逐步插入到已排序序列中的合適位置&#xff0c;從而使整個序列逐漸有序。 下面我們看一個排序的過程&#xff08;升序&#xff09;&#xff0c;給定一個int類型的數組&#xff0c;利用插入排…

docker搭建minio和python使用minio

1 準備工作 1.創建目錄 [rootk8s-storage tmp]# mkdir -pv minio/{data,conf} mkdir: created directory ‘minio’ mkdir: created directory ‘minio/data’ mkdir: created directory ‘minio/conf’[rootk8s-storage minio]# chmod 777 -R *2.生成https證書 openssl req…

開源代碼修復新標桿——月之暗面最新開源編程模型Kimi-Dev-72B本地部署教程,自博弈修復 Bug

一、介紹 Kimi-Dev-72B是由月之暗面&#xff08;Moonshot AI&#xff09;最新開源的AI編程模型&#xff0c;專為軟件工程任務設計&#xff0c;并登頂 SWE-bench Verified 基準測試榜首&#xff0c;超越 DeepSeek-R1 等模型&#xff0c;成為當前開源代碼模型的 SOTA&#xff1a…

微服務架構之基本設計原則

作為系統架構師&#xff0c;在進行架構設計時需要遵循一系列經過實踐驗證的核心原則&#xff0c;這些原則貫穿于需求分析、模塊劃分、技術選型和系統演進的全流程。以下從核心設計原則、架構特性原則、工程實踐原則三個維度&#xff0c;結合具體案例展開說明&#xff1a; 一、…

Wpf布局之WrapPanel面板!

文章目錄 前言一、引言二、使用步驟 前言 Wpf布局之WrapPanel面板&#xff01; 一、引言 WrapPanel面板以一次一行或一列的方式布置控件&#xff01; 二、使用步驟 WrapPanel面板Orientation屬性默認是"Horizontal"&#xff0c;將控件從左向右進行排列&#xff…

QEMU運行RISCV版Ubuntu

宿主機為ubuntu20.04&#xff0c;推薦ubuntu 20.04 risc-v版&#xff0c; 宿主機為ubuntu24.04&#xff0c;推薦ubuntu 24.04 risc-v版&#xff0c; 安裝ubuntu 24.04 risc-v基本步驟&#xff1a; 1&#xff0c; sudo apt update sudo apt install opensbi qemu-system-misc…

【LeetCode 熱題 100】239. 滑動窗口最大值——(解法一)滑動窗口+暴力解

Problem: 239. 滑動窗口最大值 題目&#xff1a;給你一個整數數組 nums&#xff0c;有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。返回滑動窗口中的最大值 。 文章目錄 整體思路完整代碼時空…

攻防世界-MISC-red_green

知識點 1.pngLSB隱寫 步驟 方法一&#xff1a;zsteg 打開附件&#xff0c;是一張圖片&#xff0c;打開看不懂&#xff08;其實由兩種顏色構成&#xff0c;0和1&#xff09;&#xff0c;用zsteg查看&#xff0c;發現隱寫了一張jpg圖片&#xff0c;使用zsteg提取。打開jpg圖片…

歸因問答-如何進行自動評估

歸因模型函數g的形式化表示 輸入&#xff1a;用戶問題q 輸出&#xff1a;(a, p), 其中a為答案&#xff0c;p為原始文章中支持答案a的段落。 1&#xff09;單樣本歸因 針對輸入問題q&#xff0c;如何評估歸因模型g輸出中段落p是對答案a的正確歸因。 在論文arributed qa中&…

基于vue+View UI的組織機構選擇

1、效果 1、代碼 <template><Button type"primary" click"modal true">點擊選擇</Button><div v-if"selectedArr.length > 0"><p>已選擇項&#xff1a;</p><div v-for"(item, index) in sel…

人大金倉Kingbase數據庫KSQL 常用命令指南

人大金倉Kingbase數據庫KSQL 常用命令指南 1. 連接與基本操作 1.1 連接數據庫 # 基礎語法 ksql -U 用戶名 -d 數據庫名 -h 主機名 -p 端口號 # 示例 ksql -U system -d testdb -h 127.0.0.1 -p 543211.2 執行SQL腳本 # 基礎語法 ksql -U <用戶名> -W -f <SQL腳本文…

從萌芽到領航:廣州華銳互動的 AR 奮進之路?

在 AR 技術這片充滿無限可能的領域中&#xff0c;廣州華銳互動數字科技有限公司宛如一顆耀眼的新星&#xff0c;熠熠生輝。廣州華銳互動成立于 2008 年&#xff0c;在那個 AR 技術尚處于萌芽階段、大眾認知度還較低的時期&#xff0c;廣州華銳互動便憑借著前瞻性的戰略眼光和對…

redisson看門狗實現原理

Redisson 看門狗&#xff08;Watch Dog&#xff09;機制實現原理 Redisson 的 Watch Dog 機制是分布式鎖的核心組件之一&#xff0c;用于 自動續期 鎖的過期時間&#xff0c;防止業務邏輯執行時間超過鎖的持有時間&#xff0c;導致鎖提前釋放而引發并發問題。以下是其實現原理…

C++中explicit詳解

文章目錄 1. **防止隱式類型轉換**示例1&#xff1a;沒有使用explicit示例2&#xff1a;使用explicit 2. **防止拷貝初始化**示例1&#xff1a;沒有使用explicit示例2&#xff1a;使用explicit 3. **防止隱式類型轉換的鏈式調用**示例1&#xff1a;沒有使用explicit示例2&#…

代碼部落 20250629 CSP-J復賽 模擬賽

網址&#xff1a;代碼部落 一&#xff1a; 相濡以沫 β&#xff08;代碼請自寫&#xff09; 簽到題&#xff0c;如果a[i]<a[i1] a[i]a[i1],反之&#xff0c;直接輸出No 二 共同富裕&#xff08;代碼請自寫&#xff09; 簽到題&#xff0c;用sort前綴和 如果最富有的個…

零基礎學習RabbitMQ(5)--工作模式(1)

在前面的章節中我們簡單介紹過一些RabbitMQ的工作模式&#xff0c;RabbitMQ共提供了七種工作模式進行消息傳遞&#xff0c;這里我們來詳細介紹。 1. Simple(簡單模式) P&#xff1a;生產者 C&#xff1a;消費者 特點&#xff1a;一個生產者一個消費者&#xff0c;消息只能被…

Android Liunx ffmpeg交叉編譯

本文的交叉編譯在window上安裝VMware&#xff0c;使用Ubuntu20.4進行的編譯。 一、安裝NDK&#xff1a; 1、下載解壓&#xff1a; 在NDK 下載 | Android NDK | Android Developers下載Liunx平臺的NDK。 本人下載的是android-ndk-r27c-linux.zip版本的。 解壓android-ndk-r…

極海G32R501雙向數字電源解決方案 賦能AI服務器及電源應用創新

6月26日&#xff0c;Big-Bit商務網主辦的2025中國電子熱點解決方案創新峰會在東莞召開&#xff0c;峰會以“核心智變、能效躍遷”為主題&#xff0c;聚焦光儲充、800V超充、AI服務器、BMS、智能汽車照明與汽車中小電機電控應用。 峰會期間&#xff0c;珠海極海半導體有限公司&a…

【修電腦的小記錄】連不上網

問題概述 問題表現為&#xff1a;電腦連接網絡后&#xff0c;顯示已連接但無法上網。 環境信息&#xff1a; - DNS 修改無效&#xff0c;ping 外網&#xff08;8.8.8.8&#xff09;失敗 - 嘗試重置網絡參數、多種命令無果 &#x1f50d; 排查過程 1. 執行以下命令重置網絡&a…

QT中QSS樣式表的詳細介紹

轉自個人博客 **Qt樣式表&#xff08;Qt Style Sheets&#xff0c;簡稱QSS&#xff09;**是一種類似于HTML中的CSS&#xff08;層疊樣式表&#xff09;的機制&#xff0c;用于自定義Qt應用程序的外觀。通過QSS&#xff0c;開發者可以輕松地修改控件的外觀&#xff0c;而無需更改…