跳轉到

故障排查 / 函式執行超時

函式執行超時可能有多種可能,需要根據不同情況進行辨別。

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/func-api-xxxxx"
    },
    "traceId": "TRACE-xxxxx"
}

其中,reqCost欄位為此函式從開始執行到被 Kill 經過的時間(毫秒)

可能原因及解決方案:

可能原因 解決方案
所執行的函式未指定 timeout 超時引數,但函式執行超過預設超時限制 聯絡函式開發者排查錯誤,包括且不限於:
超時引數設定過短
函式內呼叫外部系統響應過慢
所執行的函式指定了 timeout 超時引數(秒),且函式執行超時 同上

函式超時預設為 30 秒,最大設定為 3600 秒

X. 參考文件