tcp_wmem 是什么
net.ipv4.tcp_wmem 是 TCP 发送缓冲自动调优的三个边界值:最小、默认、最大,单位为字节,默认组合为 4096、16384、4194304。发送缓冲决定单连接可以积压多少已发出但尚未被确认的数据,内核会根据拥塞窗口与路径情况自动调整。大流量回源、推流、跨机房数据同步这类以发送为主的场景,放宽上限能提升对突发的吸收能力;而低延迟业务反而希望它保持较小。
基本信息
| 参数 | net.ipv4.tcp_wmem = 最小值 默认值 最大值 |
|---|---|
| 默认值 | 4096 16384 4194304(以本机回读为准) |
| 单位 | 字节,写入时三个数字用空格分隔并整体加引号 |
| 与 core 参数关系 | 应用显式 setsockopt 走 net.core.wmem_max,自动调优走这里的第三值 |
| 作用 | 限制单连接可积压的未确认数据量 |
| 观测方式 | ss 的 Send-Q 显示发送队列积压,ss -tmi 可看缓冲统计 |
典型使用场景
- 反向代理回源与大文件下发:发送侧需要更大的缓冲吸收对端处理抖动
- 推流与日志上报:突发流量下减少因缓冲不足造成的应用写入阻塞
- 排查写入阻塞:应用阻塞在写操作上时,确认是本地缓冲已满还是对端窗口为零
- 低延迟服务评估:交易与实时通信类业务反而希望缩小缓冲,避免排队延迟
- 跨机房链路上传:高 RTT 下需要更多在途数据才能跑满带宽
查看与调整
查看与调整
sysctl net.ipv4.tcp_wmem # 读三档值
sysctl net.core.wmem_max # 应用显式设置时受它限制
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216" # 放宽最大档
ss -ti | grep -E 'skmem|wscale|cwnd' # 观察发送侧缓冲与拥塞窗口
ss -tn state established | awk '{print $3}' | sort -rn | head # 看 Send-Q 最大的连接三档值读法
| 位置 | 含义 | 调整影响 |
|---|---|---|
| 第一个值 | 内存紧张时允许收缩到的最小发送缓冲 | 过小会让发送窗口骤降,吞吐抖动明显 |
| 第二个值 | 新建连接的初始发送缓冲 | 影响小请求起步的写入是否立刻阻塞 |
| 第三个值 | 自动调优上限 | 大 BDP 链路的单连接在途数据上限 |
| net.core.wmem_max | 应用显式设置的上限 | 与自动调优是两个独立边界,容易漏改 |
发送缓冲积压多不一定是好事:缓冲区占用内存,还会把排队延迟留在本机上。对延迟敏感的交易类与实时通信类业务,保持较小的发送缓冲往往比追求大吞吐更合适。
写入阻塞时要先分清方向:用 ss 看 Send-Q 是否长期不为零,再结合对端的接收窗口判断。如果是对端读得慢,本地加大缓冲只是把问题推迟,最终仍会阻塞应用写入。