端口耗尽是指系统无可用临时端口发起新连接,而非端口被长期占用;需先查ip_local_port_range确认端口池上限(如32768–60999共约2.8万个),再用ss统计TIME_WAIT数,若持续接近或超上限、且time-wait占总连接超30%、伴随“cannot assign requested address”错误及dmesg中“time wait bucket table overflow”日志,即确认为短连接风暴导致的端口耗尽。

端口耗尽不是“端口被谁占着”,而是系统没有可用的临时端口来发起新连接。排查核心是确认两点:当前端口池是否真快用完,以及这些端口是不是被大量 TIME_WAIT 连接占住。
看端口范围和已用数量
先查系统允许用哪些本地端口:
cat /proc/sys/net/ipv4/ip_local_port_range
默认输出类似 32768 60999,说明最多约 28232 个可用临时端口。
再统计当前处于 TIME_WAIT 状态的连接数(它们正占用着这些端口):
ss -tan state time-wait | wc -l
如果这个数字持续接近或超过上面算出的上限,就说明端口池实质紧张。
结合连接总数判断压力级别
运行 ss -s 查看整体连接统计,重点关注三行:
- TCP: total XXX —— 当前所有 TCP 连接总数
- estab YYYY —— ESTABLISHED 连接数
- time-wait ZZZZ —— TIME_WAIT 数量
若 time-wait 占 total 超过 30%,且 estab 不高,基本可判定是短连接风暴导致端口堆积。
确认是否真的影响新建连接
观察应用日志是否有以下典型错误:
- connect: cannot assign requested address
- bind: Address already in use(注意:不是监听端口冲突,而是源端口分配失败)
同时执行:dmesg | grep "time wait bucket"。如果出现 TCP: time wait bucket table overflow,说明内核已开始丢弃连接,问题已升级。
定位到具体进程(可选但实用)
找出谁在猛建短连接:
lsof -iTCP -sTCP:TIME_WAIT -n | awk '{print $2}' | sort | uniq -c | sort -nr | head -5
这会列出产生最多 TIME_WAIT 的进程 PID 及数量。再用 ps -p PID -o pid,comm,args 看清是哪个服务、什么命令在高频发请求。


















