本地端口耗尽怎么处置
本机作为客户端大量发短连接时,每条连接结束后会在本地留下一个 TIME-WAIT 状态,占用一个源端口大约 60 秒。当并发量足够高时,可用源端口被耗尽,新建连接开始失败,报错通常是 cannot assign requested address。处置是组合拳:开启 tcp_tw_reuse 复用时序安全的 TIME-WAIT 连接、扩大本地端口范围、并让应用改用连接池或长连接。
基本信息
| 适用平台 | Linux(net.ipv4 命名空间下的 sysctl 参数) |
|---|---|
| 核心参数 | net.ipv4.tcp_tw_reuse、net.ipv4.ip_local_port_range、net.ipv4.tcp_max_tw_buckets |
| 依赖条件 | tcp_tw_reuse 依赖 tcp_timestamps(默认开启) |
| 生效范围 | 只对客户端主动发起的连接生效,服务端被动关闭侧不受益 |
| 已废弃参数 | tcp_tw_recycle 因影响 NAT 环境,已在 Linux 4.12 移除 |
典型使用场景
- 网关或代理类服务大量外呼后新建连接失败:确认是否源端口耗尽
- 压测时出现间歇性连接失败:区分是被测服务限流还是本机端口不足
- 评估是否要调大端口范围:结合 ss -s 的 timewait 数量判断
- NAT 网关后端服务偶发失败:检查连接复用与端口回收策略
- 老系统迁移:清理仍在生效的废弃参数配置,避免照抄旧文档
现状核对与配置
现状核对与配置
sysctl net.ipv4.tcp_tw_reuse net.ipv4.tcp_timestamps net.ipv4.ip_local_port_range # 现状
ss -s | grep -i timewait # 当前 TIME-WAIT 规模
ss -tan state time-wait | wc -l # 精确计数
# 写入配置文件后执行 sysctl -p 生效
# /etc/sysctl.d/99-net-tune.conf
# net.ipv4.tcp_tw_reuse = 1
# net.ipv4.ip_local_port_range = 10240 65000
# net.ipv4.tcp_max_tw_buckets = 65536
sysctl --system # 应用全部 sysctl 配置文件参数与作用
| 参数 | 作用 | 注意事项 |
|---|---|---|
| tcp_tw_reuse | 允许客户端在时序安全时复用 TIME-WAIT 端口 | 依赖时间戳;仅对主动发起侧生效 |
| ip_local_port_range | 本机可用源端口范围 | 扩大范围同时增加冲突概率,需评估 |
| tcp_max_tw_buckets | TIME-WAIT 表的上限 | 上限过低会导致内核提前回收并打印告警 |
| tcp_timestamps | 时间戳选项 | tcp_tw_reuse 的前提,默认开启不要关 |
| tcp_tw_recycle | 已被内核移除 | 旧文档常见,照抄会直接报错 |
tcp_tw_reuse 只解决客户端主动发起方向的端口复用,且依赖 tcp_timestamps;老文档里的 tcp_tw_recycle 在 NAT 环境会造成丢包,内核 4.12 起已删除,不要开启。