本地端口耗尽是什么
客户端报「无法分配请求地址」时,多半不是对端拒绝,而是本机的临时端口用尽了:本地端口池大小有限,短连接频率乘以连接保持时间超过池容量,就会出现无法建立新连接的报错。这个报错出现在本机侧,与服务端是否监听无关。判断的关键是同时满足两个条件——处于回收态的连接数接近端口池上限,且报错集中在高频外连的进程上。
基本信息
| 典型报错 | 绑定或连接时提示无法分配请求地址 |
|---|---|
| 资源对象 | 本地端口池,默认约 2.8 万个,可用内核参数查看实际范围 |
| 缓解方向 | 扩大端口范围、启用连接复用、改长连接或用连接池 |
| 本质 | 只有到同一目标的四元组才真正争抢端口 |
| 验证方式 | 同时看回收态连接数量与报错进程,必要时再用聚合分布确认 |
典型使用场景
- 短连接密集型服务运行一段时间后开始报无法连接,重启即恢复
- 压测或活动期间客户端报连接失败,服务端却一切正常
- 网关与代理设备在高并发下出现零星建连失败
- 判断整改是否有效:改用连接池后观察报错是否消失
- 容量评估:用连接速率与保持时间估算需要多大的端口池
确认与量化
确认与量化
curl -sS -o /dev/null --connect-timeout 3 http://<目标>:80/; echo "rc=$?" # 复现报错
ss -s | grep -i timewait # 回收态连接总量
ss -Htan state time-wait | wc -l # 精确计数回收态连接
ss -Htan '( dport = :80 or dport = :443 )' | wc -l # 到特定目标的连接数
cat /proc/net/sockstat | grep -i tcp # 内核侧套接字使用统计
sysctl net.ipv4.ip_local_port_range # 本地端口池范围
ss -tanp | awk '{print $NF}' | sort | uniq -c | sort -rn | head # 按进程聚合找高频外连判据与动作
| 判据 | 含义 | 动作 |
|---|---|---|
| 回收态连接数接近端口池上限 | 本地端口池接近用尽 | 扩大端口范围并启用连接复用 |
| 报错集中在某几个进程 | 高频外连进程占用大量端口 | 改造成长连接或引入连接池 |
| 目标单一且频率高 | 到同一目标的四元组争抢最激烈 | 复用连接或按目标分散出口 |
| 报错随机出现在各进程 | 可能是句柄或内存不足 | 核对进程资源上限与其他资源指标 |
判定方法:同时看到回收态连接数接近端口池上限、且报错集中在高频外连的进程,即可确认;不满足这两个条件时,要排查是否句柄或内存不足等其他资源问题导致建连失败。
只扩大端口范围而不做连接复用,请求速率继续上升后仍会打满,只是把故障推迟。参数的调整要配合应用侧的连接复用一起做,并在调整前后各记录一次基线。