Azure Function未执行却触发超时异常的排查求助
Azure Functions 超时未启动问题排查方案
问题场景
我有一个Azure Function应用,其中包含如下函数:
[Microsoft.Azure.WebJobs.Singleton] [Function(nameof(FunctionDataUsageParseFromBlobFile))] public async Task Run([TimerTrigger("0 */1 * * * *")] MyInfo myTimer) { _logger.LogInformation($"{functionName} function processed: {DateTime.UtcNow} UTC."); }
该函数由TimerTrigger每分钟触发一次,正常运行时会记录包含UTC时间的启动日志。但有时会出现执行超时异常(应用内其他函数也存在该问题,此函数仅作示例),异常信息为:
Timeout value of 00:09:59 exceeded by function 'Functions.FunctionDataUsageParseFromBlobFile' (Id: '91921e6e-8ddf-48c0-b846-6c69dd61a369'). Initiating cancellation.
该次调用的traces中仅存在3条日志:2条为执行开始/结束的技术性日志,1条为超时日志,函数首行日志未被记录,说明函数实际并未启动。
可能的原因
- Singleton锁阻塞:函数标记了
[Singleton]特性,若前一次函数实例未正常释放锁(比如异常退出、进程崩溃),新触发的请求会一直等待锁释放,直到触发超时。TimerTrigger每分钟触发一次,锁未释放的话后续请求都会堵在获取锁的阶段,根本进不了函数代码。 - 冷启动或资源不足:如果用的是消耗计划,应用长时间闲置会休眠,触发时需要冷启动。若冷启动过程耗时超过默认10分钟的超时阈值,就会出现这种超时且代码未执行的情况。另外,当前服务计划的CPU、内存不够,进程调度不过来,也会导致函数迟迟无法启动。
- 触发器/宿主初始化异常:TimerTrigger初始化过程出错,或者Function宿主环境在准备执行函数时发生未捕获的异常,导致函数代码还没开始运行就卡壳,最终超时。
定位问题的步骤
- 检查Singleton锁状态:打开Function默认使用的存储账户,进入
azure-webjobs-hosts容器的locks文件夹,查看是否有对应函数的锁文件。如果锁文件存在且更新时间很早,说明锁没正常释放,手动删除后测试是否恢复正常。 - 查看宿主级日志:启用Function的宿主日志,这些日志会记录触发器初始化、锁获取、函数调度等阶段的细节,能直接看到函数是不是卡在了拿锁或者初始化步骤。
- 监控资源指标:在Azure门户查看Function应用的CPU、内存、磁盘IO使用率,如果超时时段资源跑满,那就是资源不足导致的调度延迟。
- 临时移除Singleton测试:先去掉
[Singleton]特性,观察是否还会出现超时未启动的情况,以此验证是不是锁的问题。
可查看详细错误的位置
- Application Insights 宿主日志:在Application Insights的日志查询中,筛选
traces表的category == "Host.Triggers.Timer"或category == "Host.Locks",能拿到触发器和锁相关的详细日志。 - 门户日志流:进入Function应用的“日志流”页面,选择“宿主日志”选项,实时查看宿主层面的初始化、调度日志,能捕获到函数代码执行前的异常。
- Kudu站点日志文件:访问
https://<你的应用名>.scm.azurewebsites.net进入Kudu站点,打开LogFiles\Application\Functions\Host文件夹,里面的宿主日志文件有更详细的初始化和错误信息。 - 存储账户日志:检查Function使用的存储账户的操作日志,看看队列、Blob操作有没有异常,毕竟Singleton锁是靠存储账户实现的。
内容的提问来源于stack exchange,提问作者Oleg Sh
相关产品推荐
相关产品推荐

