Azure Functions代理压力测试下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

