首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_mem 全局 TCP 内存水位
sysctl 内核参数72 条

net.ipv4.tcp_mem 全局 TCP 内存水位

三个页面数表示 TCP 全局内存的低水位/压力水位/上限;内核按物理内存自动计算初值,超压时限制新缓冲分配。

tcp_mem 是什么

net.ipv4.tcp_mem 用三个数字表示 TCP 全局内存的三个水位:低水位、压力水位、上限,单位是内存页而不是字节。内核在启动时按可用内存自动推导初值。占用低于低水位时分配不受限;进入压力区后内核会收紧新缓冲的分配;达到上限则拒绝新的分配并可能触发丢包。这三个值管的是整个协议栈的缓冲总开销,与单个连接的缓冲上限是不同层级。

基本信息

参数net.ipv4.tcp_mem = 低水位 压力水位 上限(单位:内存页)
默认值启动时按可用内存自动计算,以本机回读为准
当前占用/proc/net/sockstat 中 TCP 行的 mem 字段
页大小通常为 4KB,换算字节数需乘以页大小
层级关系单连接缓冲上限来自 tcp_rmem 与 tcp_wmem,这里是协议栈总量
调整建议除非明确观察到内存压力,通常保持内核计算值

典型使用场景

  • 排查网络内存异常:socket 内存持续接近上限时定位相关连接
  • 容量评估:按并发连接数与单连接缓冲估算协议栈内存需求
  • 高并发服务验收:确认默认水位是否适配业务的连接规模
  • 故障复盘:结合内存压力日志判断是否由 TCP 缓冲占用触顶引起
  • 对比验证:调整前后观察 mem 字段与连接数的变化

查看与换算

查看与换算
sysctl net.ipv4.tcp_mem                    # 三个水位,单位是页
cat /proc/net/sockstat                     # 关注 TCP 行的 mem 字段(已用页数)
getconf PAGESIZE                           # 页大小,通常为 4096
free -h                                    # 结合整体内存判断压力
ss -s | head                               # 套接字总量概览

三个水位读法

位置含义达到后的行为
低水位宽松区上限低于它时缓冲分配不受额外限制
压力水位进入压力区内核收紧缓冲增长,新分配更保守
上限硬性上限再分配会被拒绝,可能出现丢包或建连失败
sockstat mem当前已用页数与三个水位对比判断所处区间
单位换算最容易出错:这三个值是页数,把 262144 当成字节会差出上千倍。判断是否触顶应当用 sockstat 的 mem 字段与上限值对比,而不是凭整体空闲内存下结论。
只有在明确观察到内存压力或连接异常时才考虑手工调整:内核按内存规模推导的初值通常已经考虑到了实际容量的平衡。手工改动前先记录当前占用与连接规模作为基线。

易错点

  • 把页数当字节数理解:数量级差出上千倍,结论完全失真
  • 用整体空闲内存判断是否触顶:应看 sockstat 的 TCP mem 字段与上限的比值
  • 在连接数激增时先改这几个值:根因往往是连接泄漏或应用未释放连接
  • 忽略页大小差异:换算成字节时需要用本机的页大小
  • 不做基线记录就调整:后续无法判断改动是否有效

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
  • Linux 内核 Documentation/networking/ip-sysctl.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌