跳转至

故障排查 / 函数执行超时

函数执行超时可能有多种可能,需要根据不同情况进行辨别。

1. 在 DataFlux Func UI 编辑器中执行耗时过长的函数

为保护系统,对于在 DataFlux Func 编辑器中执行函数,系统会忽略 timeout 配置,耗时限制固定为 45 秒

当函数执行时间超过耗时限制后,系统会直接 Kill 进程,并抛出类似如下错误:

Text Only
1
2
3
4
5
6
7
8
#1 --------------------
执行函数: demo__demo.test_timeout()

错误堆栈:
Traceback (most recent call last):
  File "demo__demo", line 4, in test_timeout
    time.sleep(100)
billiard.exceptions.SoftTimeLimitExceeded: SoftTimeLimitExceeded()
可能原因 解决方案
所执行的函数运行超过 45 秒限制 在编辑器中执行函数主要用于开发 / 调试,应当使用较小的数据集、请求量
请勿直接执行完整长耗时任务

2. 函数执行耗时过长导致工作进程被 Kill

为了保护系统,DataFlux Func 对函数执行的最长时间有限制,不允许无限制运行下去。 在超过一定时间后,会直接 Kill 执行进程。

具体表现为:

  1. 在任务执行的日志中观察到产生包含 SoftTimeLimitExceeded 的错误,如:
Text Only
1
2
3
4
Traceback (most recent call last):
  File "demo__demo", line 4, in test_timeout
    time.sleep(100)
billiard.exceptions.SoftTimeLimitExceeded: SoftTimeLimitExceeded()
  1. 调用同步 API(旧版:授权链接)返回状态码 599,返回包含 EFuncTimeout(一般也会包含 SoftTimeLimitExceeded 信息)的如下数据:
JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
    "detail": {
        "einfoTEXT": "raise SoftTimeLimitExceeded()\nbilliard.exceptions.SoftTimeLimitExceeded: SoftTimeLimitExceeded()",
        "id": "task-xxxxx"
    },
    "error": 599.31,
    "message": "Calling Function timeout.",
    "ok": false,
    "reason": "EFuncTimeout",
    "reqCost": 5020,
    "reqDump": {
        "method": "GET",
        "url": "/api/v1/al/auln-xxxxx"
    },
    "traceId": "TRACE-xxxxx"
}

其中,reqCost字段为此函数从开始执行到被 Kill 经过的时间(毫秒)

可能原因及解决方案:

可能原因 解决方案
所执行的函数未指定 timeout 超时参数,但函数运行超过默认超时限制 联系函数开发者排查错误,包括且不限于:
超时参数设置过短
函数内调用外部系统响应过慢
所执行的函数指定了 timeout 超时参数(秒),且函数运行超时 同上

函数超时默认为 30 秒,最大设置为 3600 秒

X. 参考文档