linux默认临时端口范围32768–60999仅约28232个,高并发易耗尽导致“cannot assign requested address”错误;需通过sysctl、ss -s确认真实使用情况,可临时或永久扩至49152–65535,并配合tcp_tw_reuse、tcp_fin_timeout等调优。

Linux 默认的 ephemeral port(临时端口)范围是 32768–60999,仅提供约 28,232 个可用端口。在反向代理、微服务调用、爬虫或压测等高并发场景下,这个数量极易耗尽,表现为 connect(): Cannot assign requested address 错误——本质不是没连接能力,而是“快递单号”用完了。
确认当前端口是否真不够用
别只看范围大小,要结合实际连接压力判断:
- 查当前配置:
sysctl net.ipv4.ip_local_port_range或cat /proc/sys/net/ipv4/ip_local_port_range - 看真实使用情况:
ss -s,重点关注两行:-
timewait数量(TIME-WAIT 连接数) -
ports行(如ports 28150),这是内核历史上已分配过的端口计数,不是剩余数
-
- 算理论上限:结束值 − 起始值 + 1(例如 60999 − 32768 + 1 = 28232)。若
ports值接近该数,且timewait占比超 30%,就说明端口正在枯竭
临时扩容:立即生效,重启失效
适合压测验证或紧急修复,不写磁盘,风险低:
- 用 sysctl 修改:
sudo sysctl -w net.ipv4.ip_local_port_range="10240 65535" - 或直写 proc:
echo "10240 65535" | sudo tee /proc/sys/net/ipv4/ip_local_port_range - 起始值必须 ≥ 1024(避开特权端口),结束值 ≤ 65535;推荐避开常用业务端口(如 8080、9000、5432 等)
- 改完立刻验证:
sysctl net.ipv4.ip_local_port_range应输出新值
永久生效:生产环境必须配置
否则重启后打回原形,故障重现:
- 创建独立配置文件:
sudo nano /etc/sysctl.d/99-ephemeral-ports.conf - 写入一行(推荐 IANA 建议的高端范围):
net.ipv4.ip_local_port_range = 49152 65535 - 重载配置:
sudo sysctl --system(兼容性好,自动扫描/etc/sysctl.d/) - 注意:若目录下有多个同名参数,按文件名 ASCII 顺序加载,后加载的覆盖前加载的
配套调优不能少
单扩端口是治标,高并发下还需协同优化:
- 启用 TIME-WAIT 复用:
sudo sysctl -w net.ipv4.tcp_tw_reuse=1(允许把处于 TIME-WAIT 的端口快速用于新连接) - 缩短 FIN 超时:
sudo sysctl -w net.ipv4.tcp_fin_timeout=30(默认 60 秒,加快端口回收) - 预留关键端口(可选):
echo "8080,9000-9005" | sudo tee /proc/sys/net/ipv4/ip_local_reserved_ports,避免动态分配冲突 - 应用层配连接池:如 HTTP 客户端设合理
maxIdle和minEvictableIdleTime,减少短连接风暴











