网络分析模型五

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 

image

 


🧠 Linux 网络缓冲区与内核参数全景图文手册(含作用范围)


一、总览结构图(从应用到驱动)

┌────────────────────────────────────┐
│             用户空间               │
│  应用程序 write()/send()/read()    │
│                                    │
└──────────────┬─────────────────────┘
               │ 系统调用
               ▼
┌────────────────────────────────────┐
│           内核 socket 层            │
│  Send buffer ←→ Recv buffer         │
│  ↑受 net.core.{rmem,wmem}_max 限制  │
│  ↑应用 setsockopt(SO_SNDBUF/RCVBUF) │
└──────────────┬─────────────────────┘
               │
               ▼
┌────────────────────────────────────┐
│           TCP 协议栈层             │
│ 自适应缓冲区动态调整:              │
│   tcp_rmem = [min, default, max]    │
│   tcp_wmem = [min, default, max]    │
│ 受 net.core.{rmem,wmem}_max 约束     │
└──────────────┬─────────────────────┘
               │
               ▼
┌────────────────────────────────────┐
│           网络设备/驱动层           │
│   网卡发送队列(tx_queue_len)        │
│   网卡接收环形缓冲(rx ring buffer)  │
│   驱动统计 ethtool -S 查看           │
└────────────────────────────────────┘

二、缓冲区分类、职责与作用范围

层级缓冲区类型作用描述典型内核参数作用范围
用户空间 应用缓冲区 用户数据区,通过系统调用送往内核 单个应用线程/进程
内核 socket send/recv buffer 应用写入数据后暂存于此,等待发送/接收 net.core.rmem_max / net.core.wmem_max 单个 socket(受 core max 限制)
TCP 层 自适应缓冲区 根据带宽延迟(BDP)动态调整窗口 net.ipv4.tcp_rmem / net.ipv4.tcp_wmem 单个 TCP 连接动态调整
驱动层 网卡队列缓冲 实际发送到物理网卡前的硬件队列 tx_queue_len、ethtool、/proc/net/dev 网卡全局(所有 socket 共享)
硬件 网卡 DMA buffer 硬件直接搬运数据区 驱动控制,不可调 网卡全局

三、关键内核参数详解(含作用范围)

1️⃣ 全局 socket 硬上限(作用范围:单个 socket)

参数默认值含义作用范围
net.core.rmem_max 212992 所有 socket 接收缓冲区最大值 单个 socket
net.core.wmem_max 212992 所有 socket 发送缓冲区最大值 单个 socket
net.core.rmem_default 212992 默认接收 buffer 单个 socket
net.core.wmem_default 212992 默认发送 buffer 单个 socket

⚙️ 受应用 setsockopt() 调整限制。


2️⃣ TCP 自适应参数(作用范围:单个 TCP 连接)

参数默认值含义作用范围
net.ipv4.tcp_rmem 4096 87380 6291456 TCP 接收缓冲区 [min default max] 单个 TCP 连接动态增长
net.ipv4.tcp_wmem 4096 16384 4194304 TCP 发送缓冲区 [min default max] 单个 TCP 连接动态增长

实际最大 buffer = min(tcp_*_max, net.core.*mem_max)


3️⃣ UDP/RAW 套接字(作用范围:单个 socket)

  • 仅受 rmem_max / wmem_max 限制

  • 无自适应机制

  • 每个 socket 的上限 = net.core.*_max


4️⃣ 网卡层缓存与队列(作用范围:网卡全局)

参数/命令含义作用范围
/sys/class/net/eth0/tx_queue_len 网卡驱动层发送队列长度 网卡全局,所有 socket 共享
ethtool -g eth0 查看网卡 ring buffer 大小(驱动级) 网卡全局
ethtool -S eth0 查看 tx/rx packet 数量、drop 情况 网卡全局
/proc/net/dev 每个设备的包统计计数 网卡全局

四、查看与排查方法汇总

层级命令用途作用范围
系统全局 `sysctl -a grep mem_max` 查看 socket 全局上限
TCP 动态 sysctl net.ipv4.tcp_rmem 查看自适应配置 单个 TCP 连接
socket 实时 ss -t -a -m 查看每个连接缓冲区使用 单个 socket / TCP 连接
TCP 队列 cat /proc/net/tcp 查看 tx/rx 队列长度 单个 TCP 连接
UDP 溢出 `dmesg grep UDP` 检查 UDP overflow
网卡队列 ethtool -S eth0 检查 tx queue、drop 情况 网卡全局

五、判断缓存区是否满

1️⃣ TCP 缓冲区(单个 socket / TCP 连接)

ss -t -a -m | grep 443
  • r= 接收 buffer 当前使用字节

  • w= 发送 buffer 当前使用字节

  • 接近 tcp_rmem[2]/tcp_wmem[2] → 缓冲区可能满


2️⃣ UDP 缓冲区(单个 socket)

ss -u -a -m
dmesg | grep UDP
  • Recv-Q 长时间增长或出现 overflow → 缓冲区不足


3️⃣ 网卡队列(网卡全局)

ethtool -S eth0 | egrep 'tx_errors|rx_dropped'
  • tx_errors / rx_dropped 增长 → 驱动或硬件队列满


六、动态调优示例(作用范围说明)

# 全局上限 (每个 socket 最大值)
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216

# TCP 自适应 (单个 TCP 连接动态增长)
sysctl -w net.ipv4.tcp_rmem="4096 131072 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 131072 16777216"

# 网卡队列 (网卡全局)
ip link set eth0 txqueuelen 5000

七、调优建议表(含作用范围)

场景配置作用范围备注
高并发 Web rmem/wmem = 4MB, tcp_*mem = 4K/128K/8M socket / 单个 TCP 连接 小包高并发
跨机房高 RTT rmem/wmem = 16MB, tcp_*mem = 16K/256K/16M socket / 单个 TCP 连接 长距离链路
UDP 视频流 rmem_max/wmem_max = 16MB 单个 socket 避免丢包
日志/大包传输 tcp_wmem/tcp_rmem 上限调高 单个 TCP 连接 高吞吐场景

八、socket 用户态 vs 内核态关系图(含作用范围)

用户态 buffer (应用内存)
        │
        ▼
  write()/send()
        │
        ▼
┌────────────────────┐
│ 内核态 socket 缓冲区 │ ← SO_SNDBUF / SO_RCVBUF (单个 socket)
│ 受 core.*mem_max 限制 │
└────────────────────┘
        │
        ▼
TCP 自适应层 (tcp_*_mem, 单个 TCP 连接)
        │
        ▼
驱动发送队列 (tx queue, 网卡全局)
        │
        ▼
网卡 DMA 缓冲 (硬件层, 网卡全局)

✅ 现在文档完整覆盖:

  1. 缓冲区类型、作用、作用范围

  2. 内核参数、默认值、作用范围

  3. 查看与排查方法

  4. 动态调优示例

  5. TCP/UDP/网卡分层关系


 

posted on 2025-09-20 21:57  吃草的青蛙  阅读(9)  评论(0)    收藏  举报

导航