Azure Function写日志到Table Storage抛10055 StorageException修复咨询
Azure Function SocketException 10055 修复方案
该异常本质为函数实例临时TCP端口耗尽,结合堆栈触发自Azure WebJobs内置日志写入Table Storage的流程,可通过以下方案修复:
优化内置日志写入配置
- 降低Table Storage日志写入级别
在host.json中修改日志输出级别,减少不必要的日志写入连接:
原理:默认的运行日志聚合结果会频繁写入Table Storage,高并发下会快速占用临时端口。{ "logging": { "logLevel": { "Default": "Warning", "Host.Aggregator": "Warning", "Host.Results": "Warning" } } } - 切换日志存储目的地
如果不需要查询Table Storage中的历史运行日志,可直接禁用内置Table Storage日志写入,统一将日志输出到Application Insights:{ "logging": { "azureWebJobsStorage": { "enabled": false }, "applicationInsights": { "enabled": true } } }
修复代码端连接复用问题
- 统一复用客户端实例
所有对外请求的客户端(包括HttpClient、Blob Storage SDK客户端、Cosmos DB SDK客户端)都改为静态单例持有,不要在每次函数触发执行时新建实例,避免每次请求都新建TCP连接产生大量TIME_WAIT状态套接字:// 正确写法:单例持有客户端 private static readonly HttpClient _blobHttpClient = new HttpClient(); private static readonly CosmosClient _cosmosClient = new CosmosClient("连接字符串"); // 错误写法:每次执行都新建客户端,会快速耗尽端口 public async Task Run(QueueTrigger trigger) { var newHttpClient = new HttpClient(); var newCosmosClient = new CosmosClient("连接字符串"); } - 不要手动禁用SDK的默认连接池机制,不要强制关闭HTTP Keep-Alive
调整系统TCP参数
- 针对高级计划、ASE等独占模式的函数实例,可在启动脚本中调整TCP配置,缩短TIME_WAIT套接字回收时间、扩大临时端口范围:
# 允许复用TIME_WAIT状态的端口 sysctl -w net.ipv4.tcp_tw_reuse=1 # 扩大可用临时端口范围 sysctl -w net.ipv4.ip_local_port_range=1024 65000
控制并发峰值
- 在
host.json中调低单实例的并发请求上限,避免同时发起过多出站连接:{ "extensions": { "http": { "maxConcurrentRequests": 20 }, "queues": { "batchSize": 10 } } }
内容的提问来源于stack exchange,提问作者Mic
相关产品推荐
相关产品推荐

