You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Functions代理压力测试下Socket异常的原因及系统限制排查

分析与解决:Azure Functions Premium代理压力测试的Socket端口耗尽问题

嘿,从你贴的异常日志 Only one usage of each socket address (protocol/network address/port) is normally permitted 就能直接定位——这是典型的扩展性问题,不是代理配置本身的锅。下面给你一步步理清楚:

为啥会出这问题?

当你的Functions代理在60秒内发2000次请求到VNet里的VM IIS时,每一次出站请求都会占用一个本地的Socket源端口。Windows系统默认的临时端口范围是49152到65535,总共才16000多个可用端口,而且端口用完释放后,还会进入TIME_WAIT状态默认挂240秒才能再用。短时间内这么多请求,直接把可用端口耗光了,新请求连Socket都建不起来,自然就抛出500错误了。

  • 后端IIS没报错很正常:因为这些失败的请求根本没到后端,是Functions这边连不上而已
  • 你的代理配置没问题:proxies.json的路由转发是标准写法,正常流量下跑的好好的,只是压力场景暴露了系统的端口限制

该怎么解决?

1. 调整Functions的应用配置

在Azure门户里给你的Functions加几个应用设置,优化连接池和端口复用:

  • WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT:调高这个值,让Premium计划能扩出更多实例分摊连接压力(比如根据你的请求量调到10或更高)
  • HTTP_CLIENT_CONNECTION_LIMIT:设成1000左右,提升每个实例能处理的并发连接数
  • WEBSITE_TCP_KEEPALIVE_IDLE:设成300秒,减少端口在TIME_WAIT状态的停留时间

2. 优化后端VM的TCP参数

登录到VNet里的IIS服务器,修改注册表的TCP设置(改完记得重启服务器):
找到注册表路径 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,调整以下键值:

  • TcpTimedWaitDelay:改成30(秒),缩短TIME_WAIT的时长
  • MaxUserPort:调到65535,扩大可用的临时端口范围
  • TcpNumConnections:适当调高,增加系统允许的最大连接数

3. 确认启用连接复用

Azure Functions的代理默认应该会复用HTTP连接,但保险起见可以显式开启:
在应用设置里添加如下键值对:

{
  "Values": {
    "HttpClientPoolingEnabled": "true"
  }
}

这样能减少重复创建Socket的次数,降低端口消耗。

4. 配置Functions自动缩放

Premium计划支持弹性缩放,你可以在Azure门户设置缩放规则,比如基于CPU使用率或请求队列长度自动扩容,让实例数跟着请求量动态调整,每个实例的压力就小了,端口也不会轻易耗尽。

验证效果的方法

改完配置后再跑一次压力测试:

  • 查看Application Insights里的异常是否消失
  • 在Functions的指标页面监控「出站连接数」,确认数值稳定在合理范围
  • 在后端VM上执行 netstat -ano 命令,观察TIME_WAIT状态的端口数量是否大幅减少

内容的提问来源于stack exchange,提问作者Raphaël

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:17:40