临时端口与耗尽
客户端发起连接时本地端口由内核从临时端口范围中挑选,四元组(源地址、源端口、目的地址、目的端口)必须唯一。短连接高频、且目标集中时,可用的本地端口会被正在使用或等待回收的连接占满,新建连接就开始随机失败,应用侧往往只看到笼统的连接失败或「地址不可用」。这类故障的特点是对端一切正常、失败呈间歇分布,用 ss 与内核参数一查即可分辨。
基本信息
| 适用平台 | Linux(参数位于 sysctl 的 net.ipv4 命名空间) |
|---|---|
| 查看参数 | net.ipv4.ip_local_port_range |
| 关联参数 | net.ipv4.tcp_tw_reuse、net.ipv4.ip_local_reserved_ports |
| 典型错误 | EADDRNOTAVAIL,表现为建连失败而非超时 |
典型使用场景
- 压测或大促期间出现间歇性建连失败,需要对端侧与本地端口两头排查
- 网关或代理类服务出向连接突然出现失败率上升
- 确认临时端口范围是否需要扩宽,以及是否与保留端口冲突
- 分析等待回收状态连接堆积对可用端口的挤占
- 为连接池配置提供依据:连接复用能显著降低端口压力
- 对比启用端口复用前后的失败率变化
检查命令
检查命令
sysctl net.ipv4.ip_local_port_range # 查看可用的临时端口区间
ss -tan | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head
# 上面统计本地端口的占用分布,集中在区间边缘即可疑
ss -tan state time-wait | wc -l # 看等待回收的连接规模
ss -s # 汇总视图,先看总量再钻取ss 输出逐列读法
| 列 | 含义 | 异常表现 |
|---|---|---|
| State | 连接状态 | 大量等待回收状态说明回收跟不上建立 |
| Recv-Q | 接收队列待读字节 | 持续非零表示应用读取慢 |
| Send-Q | 发送队列待发字节 | 持续非零表示对端或链路受限 |
| Local Address:Port | 本地地址与端口 | 端口集中在区间两端说明接近耗尽 |
| Peer Address:Port | 对端地址与端口 | 目标集中在少数几个对端时更易耗尽 |
端口耗尽与等待回收状态堆积通常同时出现,两者要一起评估;只扩范围不解决应用连接泄漏,问题会平移而不是消失。
端口复用能缓解出向连接压力,但需要时间戳相关选项配合,改动属于协议栈级操作,验证后再逐步放量。