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 字段与上限值对比,而不是凭整体空闲内存下结论。
只有在明确观察到内存压力或连接异常时才考虑手工调整:内核按内存规模推导的初值通常已经考虑到了实际容量的平衡。手工改动前先记录当前占用与连接规模作为基线。