跳转至

故障排查 / 函数执行超时

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

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

为保护系统,对于在 DataFlux Func 编辑器中执行函数,系统会忽略timeoutapi_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. 调用授权链接返回状态码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 秒

3. 函数执行耗时过长导致授权链接提前返回

为了保护系统,DataFlux Func 对通过授权链接调用函数的最长响应时间有限制,不允许服务器无限制保持 HTTP 连接。 在超过一定时间后,API 层面会放弃等待函数返回,直接响应 HTTP 请求。

具体表现为:

  1. 调用授权链接返回状态码599,返回包含EAPITimeout的如下数据:
JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
    "detail": {
        "id": "task-xxxxx"
    },
    "error": 599.1,
    "message": "Waiting function result timeout, but task is still running. Use task ID to fetch result later.",
    "ok": false,
    "reason": "EAPITimeout",
    "reqCost": 3011,
    "reqDump": {
        "method": "GET",
        "url": "/api/v1/al/auln-xxxxx"
    },
    "traceId": "TRACE-xxxxx"
}

API 接口超时仅表示 HTTP 响应时间超时,此时函数可能依然在后台运行,并遵循函数超时处理逻辑

可能原因及解决方案:

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

API 超时默认为 10 秒,最大设置为 180 秒。同时,API 超时不会长于函数超时

X. 参考文档