JasonAirJasonAir

Windows 动态端口耗尽问题排查:一次业务异常的定位与修复

5 分钟阅读工具

有时候,业务异常看起来像网络问题,实际却是操作系统资源耗尽。

这次碰到的就是一个典型案例:Windows 服务器上的业务突然访问异常,页面直接报错,看起来像是网络不通、服务挂了,或者 DNS 有问题。但沿着这些常规方向查了一圈后,真正的根因却落在了 TCP 动态端口范围过小 上。

现象:业务访问异常,但常规检查都正常

最开始的现象并不复杂:访问目标地址时报错,浏览器无法正常打开页面。

浏览器报错截图

从症状上看,这类问题很容易让人先怀疑:

  • 服务没有启动
  • 网络链路有问题
  • DNS 解析异常
  • 防火墙策略拦截

但实际排查下来:

  • 服务本身正常
  • 基础网络没有明显异常
  • DNS 配置无误
  • 应用日志里也没有非常直接的报错线索

这就说明,问题虽然体现在“访问失败”,但根因未必在应用层。

排查:检查 Windows 的 TCP 动态端口范围

当应用、网络、DNS 这些常规方向都排除后,就需要进一步检查系统层资源。

在 Windows 上,可以先用下面这条命令查看 TCP 动态端口范围:

netsh int ipv4 show dynamicport tcp

输出如下:

协议 tcp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

也就是说,这台机器当前的 IPv4 TCP 动态端口配置是:

  • 起始端口:49152
  • 端口数量:16384

这个范围在默认场景下通常没问题,但如果业务存在大量短连接、高频外部调用、代理转发,或者某些连接释放不及时,就有可能把可用动态端口很快耗尽。

根因:动态端口不足,导致新连接无法建立

动态端口(ephemeral port)本质上是系统在建立出站连接时临时分配的本地端口。

一旦这部分端口资源被大量占用,就会出现下面这些现象:

  • 新连接建立失败
  • 应用访问外部服务异常
  • 浏览器或客户端报网页无法显示、连接失败
  • 业务看起来像“网络故障”,但实际是本机端口池被打满

这次问题的本质就是:

Windows 默认 TCP 动态端口范围偏小,在当前业务连接压力下,端口资源被耗尽,导致新的连接无法继续分配。

处理:扩大 TCP 动态端口范围

确认方向后,处理方式就比较直接:把动态端口范围放大。

执行以下两条命令:

netsh int ipv4 set dynamicport tcp start=10000 num=55535
netsh int ipv6 set dynamicport tcp start=10000 num=55535

这两条命令分别对 IPv4 和 IPv6 的 TCP 动态端口范围进行调整:

  • 起始端口调整为 10000
  • 可用端口数量扩大为 55535

调整完成后,业务恢复正常。

为什么这个方法有效

在高并发或大量短连接场景下,动态端口池的大小直接决定了系统能承受多少临时连接分配。

把端口范围扩大后,收益主要体现在两点:

  1. 提升可用端口总量 给系统更多可分配的临时端口,降低端口耗尽的概率。

  2. 缓解高频连接场景的资源压力 比如:

    • 高频 HTTP 请求
    • 代理或网关转发
    • 数据库短连接
    • 第三方接口调用

当然,这种方式更像是“扩容”而不是“治本”。 如果业务本身存在不合理的短连接设计、连接复用不足,或者 TIME_WAIT 数量异常堆积,后续仍然建议继续从应用层做优化。

这类问题的几个排查建议

遇到“看起来像网络问题,但常规排查没有结论”的场景时,可以把下面几个方向纳入检查清单:

  • 检查应用是否存在大量短连接
  • 检查系统是否存在大量 TIME_WAIT 或其他异常连接状态
  • 检查动态端口范围是否过小
  • 检查本机连接数是否持续飙升
  • 结合 netstat、系统日志、性能监控一起判断

很多时候,问题不是服务挂了,而是系统资源先扛不住了。 而在 Windows 上,动态端口就是一个非常容易被忽略的瓶颈点。

结语

这次问题的经验很有代表性:

  • 现象:业务访问异常,看起来像网络问题
  • 排查:通过 netsh int ipv4 show dynamicport tcp 查看动态端口范围
  • 发现:Windows 默认 TCP 动态端口数量有限
  • 处理:通过 netsh int ipv4/ipv6 set dynamicport tcp 扩大范围
  • 结果:业务恢复正常

如果你在 Windows 服务器上也碰到类似的连接失败、网页打不开、服务看起来正常但访问异常的问题,不妨把动态端口配置也列入排查项。

它不一定总是根因,但一旦命中,修复往往非常直接。