【网络】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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;而无需更改…